Check List



Cover Page

Under construction


Abstract

Under construction

The purpose of this thesis is to understand the economic impact the Covid-19 crisis had on housing prices and how these impacts changed the relative demand of homeowners for certain hedonic features of a home. To determine which variables would be important to analyze, an eXtreme Gradient Boost (XGBoost) machine learning algorithm was trained on a large (i.e. \(104\times24412\)) dataset of hedonic features from Louisiana, USA market data. An analysis of the XGBoost’s variable-importance ranking shows that number of bedrooms, city centrality, total living area, age, and days on the market were among the top most important variables in determine a homes market price. Therefore, a deeper dive into how the crisis impacted the relative demand for these features is critically important in understanding the bigger picture of Covid-19’s impact on the housing market.

A panel of analysis shows that Covid-19, measured by the daily 3-month moving average of official infections at the time of sale, significantly increased average home prices by 8.97 USD per additional daily infection. This finding establishes the corona-specific reaction of housing market prices to daily infections. When analyzing how this price shift is explained by specific demand for certain property characteristics, I find: the premiums for each level of number of bedrooms is significantly increased in response to daily infections, with an average increase of 32, 37, 27, and 47 USD per additional daily infection for levels 2-through-5 bedrooms respectively; the premimum for being central to a city increased by 5.17 USD per daily infection while properties located outside the city were not significantly impacted by daily infections; premiums for home size increased by 0.02 USD per daily infection, with the premium for the smallest homes being significantly decreased by 3.15 USD per daily infection; premiums for property age, which are historically negative, decreased even further with the penalty for each additional year of age increasing by 0.06 USD per daily infections with the oldest homes experiencing the largest loss of 2.75 USD per daily infection, per year of age and; an increase in the penalty for each additional day a home sits on the market of 0.04 USD per daily infection with homes sitting the longest period of time on the market experiencing the largest loss of 2.75 per daily infection, per day.


Table of Contents

  1. Introduction
  2. Literature Review
  3. Data
  4. Methodology
  5. Results
  6. Discussion
  7. Conclusion
  8. Bibliography
  9. Appendix


Figures, Tables, and Abbreviations

Under construction



1. Introduction

In late 2019, a virus first detected in Wuhan, China would set in motion a global pandemic which, by the end of 2021, will have killed 4.3 million people, infecting 238 million others, and disrupting the global economy across virtually every measurable dimension (WHO 2021). According to seven economic impact models constructed by McKibbin and Fernando (2020), estimates of the total global economic loss in terms of GDP are measured to be as large as 9.2 trillion USD. However, despite a generally positive correlation between GDP and real estate prices (see figure 1), historically measured as high as 98%, real estate market prices in the US hit near-record heights following the outbreak of COVID-19 (Anissanti 2021). According to a report released by Zillow Analytics (Manhertz 2021), U.S. real estate gained 2.5 trillion dollars of value in 2020 alone, representing the largest single-year growth since 2005, despite an approximately 760 billion dollar decrease in GDP in the same year (FRED 2021). The focus of this thesis is to investigate the reasons behind why and how real estate market prices have broken trend and behaved so uncharacteristically counter cyclical in the face of a global pandemic.


Figure 1


In the following sections, I will apply the Hedonic Pricing Method (HPM) to Louisiana housing market data in order to inferentially describe the economic impact of the global pandemic on residential housing market values. Furthermore, I will take advantage of the HPM’s structural framework of using real estate properties’ hedonic features (e.g., size, age, number of bedrooms, etc.) to test for changes in demand for specific property features pre vs post pandemic. The HPM will be econometrically modeled using an Ordinary Least Squares (OLS) regressions framework for specific variable analysis while several variations of machine learning (ML) prediction models will be estimated to test different independent variables’ maximum explanatory power in predicting out-of-sample observations. The results of these models will shed light into the otherwise counter intuitive response of real estate pricing dynamics to the COVID-19 global pandemic.



2. Literature Review

2.1 Background

The market value of a commodity is most often theoretically defined as the equilibrium price derived from the basic economic principal, or law, of supply and demand (Locke and Engels 1691; Epple 1987). However, the real estate market often violates this assumption due to its unique characteristics as an asset class (Wheaton 1999). For example, much of the underlying utility of a property is its use as a means of shelter by its owner (LING, OOI, and LE 2015). This rather unusual relationship to this asset introduces several behavioral biases which cause economic frictions not accounted for by traditional neoclassical economic theory (Nicolaides 1988). A notable example of behavioral bias impacting real estate price dynamics is the endowment effect. This behavioral finding was originally established by Kahneman, Knetsch, and Thaler (1990) in the late 20th century, and later applied to real estate markets by BAO and GONG (2016). The latter of the two stating that the predictably irrational behavior of market participants to overvalue their home due to sentimental attachment to the property forces market prices into sustained economic disequilibrium. Other highly cited and unusual characteristics are that real estate assets are very infrequently traded due to high transaction costs (Collett, Lizieri, and Ward 2003; Guilkey, Miles, and Cole 1989), governments tend to interfere, both directly and indirectly with real estate markets through the creation of fiscal and monetary policies (Bingyang, Jie, and Yinhan 2013; Du, Ma, and An 2011), and through creating renter-protections laws such as ‘squatter’s rights’ laws which allow a renter to remain in a home for extended periods of time long after they have stopped paying rent (Hoy and Jimenez 1991; Gardiner 1997).

2.2 Real Estate Valuation Methods

The idiosyncratic asset features outlined in section 2.1 along with a high level of heterogeneity across many dimensions of the entire real estate asset class makes the creation of a generalized pricing model difficult and have led to a wide range of proposals and recommendations about what determines the market price of real estate assets and how to reliably model those pricing dynamics (Curcuru et al. 2010). In Pagourtzi et al. (2003), the authors outlines several of the currently accepted real estate valuation methods, ranging from what they categorize as the traditional methods, such as comparable-group, cost, income-multiple, profit-multiple, and contractor’s method, to the advanced methods, such as ANNs, spatial analysis methods, fuzzy logic, and the hedonic pricing method. According to a meta analysis conducted by Sirmans et al. (2006), currently, the most widely used and accepted advanced methodological framework for real estate valuation modeling is the Hedonic Pricing Method.

2.2.1 Hedonic Prcing Model in Real Estate

First applied in 1939 on automobile data, according to Goodman (1978), the HPM is a model which estimates the value of distinct characteristics of a commodity which directly or indirectly contribute to its market value. Besides its implementation in real estate finance and economics, such as in this thesis, this methodology has a wide range of applications such as its implementation in consumer and market research (Holbrook and Hirschman 1982; Arnold and Reynolds 2003), construction of consumer price indices (Moulton 1996; Schultze 2003), various tax assessments (Berry and Bednarz 1975; Bernasconi, Corazzini, and Seri 2014), automated automobile valuation (Cowling and Cubbin 1972; Matas and Raymond 2009), and computer sales (Dulberger 1987; Wakefield and Whitten 2006).

Since its introduction, the HPM has gain significant popularity among housing market and commercial real estate researchers. The specific real estate-based topics include, but are not limited to, the construction of housing price indices (Gouriéroux and Laferrère 2009; Wallace and Meese 1997), the estimation and prediction of a property’s market value in situations where market-transaction data is low-dimensional or non-existent (LeSage and Pace 2004), and, as in this thesis, the specific analysis of changes in the demand for specific property characteristics across time, subgroups, or both (Clapp and Giaccotto 1998). As the broad search for a satisfactory modeling framework focuses in on the HPM, another debate arises regarding the best functional form of this method. Traditionally utilizing the standard OLS framework (Pace and Gilley 1998), researchers are increasingly utilizing a variety machine learning algorithms to accomplish an increasingly more refined set of findings.

2.2.2 OLS and the Hedonic Pricing Model in Real Estate

Unsurprisingly, regression analysis is the preferred estimation approach among real estate researchers when using HPT for price estimation. These multiple regression analysis methods are most often either an Ordinary Least Squares (OLS) regression or a Maximum Likelihood approximation of the log-likely equation derived directly from the hedonic function. Each of these estimation methods take a functionally similar path as they both estimate a vector of parameters (i.e. beta coefficients) that best fits the explanatory hedonic variables to the associated market price. They differ only by the loss function used in the identification of that best-fitted parameter vector.

The most commonly used hedonic price regression equation with respect to real estate markets models the relationship between market rents or market property values to a list of hedonic characteristics. The classical construction of this model according to (Herath, S. K. & Maier, G. (2010)) is the following:

\[ R = f(P,N,L,t) \] where \(R\) is rent or price of the property; \(P\) is property related attributes; \(N\) is neighborhood characteristics; \(L\) is locational variables and; \(t\) is an indicator of time.

2.2.3 Machine Learning and the Hedonic Pricing Model in Real Estate

Though first introduced by Turing (1950) under the broader umbrella term of artificial intelligence, the adoption of ML methods in real estate would take many years of software and hardware development, allowing or the subsequent collection of ever-growing data sets and central processing unites (CPUs) capable of processing the often extraordinary number of calculation required to produce a solution for a given algorithm (Dutta 2018). The primary advantage of ML techniques are that ML algorithms learn and improve over time and across many iterations and variable combinations, while tradition statistical and econometric techniques produce static results across a single model (Anguita et al. 2010). The algorithm improves across those iterations as it seeks to minimize the model’s error in predicting observations not previously seen, often called out of sample observations. By doing this, the algorithm seeks to find the strongest general relationship between the independent variables and the dependent variable instead of seeking to minimize the error within a given sample set. This in tern results in stronger, more generalized interpretation of the findings.

Mohd et al. (2020) provides a thorough overview of the various applications of ML to real estate valuation methods, including the Ridge, Lasso regression techniques as well as artificial neural networks (ANN) and gradient boosting techniques used in this thesis. The author concludes that ML models out perform other standard valuation methods such as multiples and OLS valuation methods in both accuracy and strength of interpretation. The best performing of these models was a gradient boosting model, which was able to capture the often hidden layers of interaction between hedonic features.


2.3 COVID-19 Crisis’ Impact on Real Estate Markets

In the wake of the COVID-19 crisis, there were several papers and articles regarding the economic impact of the global pandemic on the housing market being expeditiously publishes in virtually every major journal. These papers investigate topics such as structural and temporal changes in the housing market using hedonic methods (Shimizu et al. 2010), changes in housing market demand for specific property types and features (Tajani et al. 2021), potential changes in housing preferences due to the COVID-19 pandemic and highlight the challenges for policy making (Nanda et al. 2021). Each of these papers result in findings which establish a statistically significant impact of COVID-19 on relative demand for certain hedonic features in each respective real estate market. Later in this thesis, I will establish a similar finding in the Louisiana housing market.



3. Data

3.1 Data Collection

The utilization of Big Data collected through a data-mining process called web-scrapping has increasingly become the method of choice for researchers across disciplines. The term web-scrapping simply refers to the process of collecting structured data from websites using algorithms to automate the collection process. Methods similar to ones I have implemented in this thesis have been used by established authors such as Borde et al., Pérez-Rave et al. and Berawi et al.

In this thesis, I have used a mixture of the programming languages R and Python, supplemented by several packages created by Selenium, to write an algorithm that collects the required hedonic variables for this research from the Multiple Listing Services (MLS). Table 1 is a summary of the original data set’s key features.

3.2 Data Processing

Though the data-collecting algorithms return structured data, it is nevertheless far from being suitable for the rather picky models which will eventually analyze them. Therefore, the following processes were completed in order to render the raw data into a usable form:

  1. Missing values (i.e. N/A values) were removed
  2. Outliers were identified and removed for all continuous variables
    • An ‘outlier’ is defined by being more than 1.5 standard deviations from the mean of the variable’s own distribution
  3. Multilevel factor data was broken out by each level into binary representations through Hot-One coding
    • Some features which had a large number of factor levels were simplified using Lasso regressive methods
  4. High-leverage point observations, according to diagnostic linear regression, were removed
  5. Duplicates, defined by the MLS unique identification number, were removed
  6. Structural errors (e.g. dates structured as string variable) were corrected
  7. Binary variables were created for key variables (e.g. city_limits) by the following standard method:

\[ I\left(y\right)=\left\{\begin{array}{ll}1,\quad x\in A\\0, \quad x \notin A\end{array}\right., \] Where \(I\) is an indicator function with space \(A\) that composes dummy variable \(x\) into \(1\) if the condition is met and into \(0\) if it is not.


Table 1


The results of the data cleaning processes cane be seen in table 2.


Table 2


3.3 Variable List

A list and short discription of all variables used in this thesis can be found in Table 3


Table 3




3.3 Data Distriptive Statistics

3.3.1 Correlation

The correlation matrix (see Image 2) between all numeric variables shows that with exception to the variables which will have obvious correlations (e.g. sold_price and list_price, area_total and area_living, and infections figures), there are no other correlations which would cause concern.


Image 2


3.3.2 Distributions of Select Variables

As the standard descriptive characteristics of a particular variable are considered (i.e. measures of frequency, central tendency, dispersion, and position), the matrix of density plots below (see Image 3) give us a good overview of the most relevant variables in this data set.


Image 3
3.3.3 Price Index

To understand the general shape and historical trend of the pricing market specifically within Louisiana, I have constructed a simple weighted-average price per sqft. index (see Image 4) using 1, 2, 3, and 4 month-moving averages of the entire data set. Furthermore, I show the St. Louis Federal Reserve’s GDP (green) and price index (purple) for the Louisiana housing market (see Image 5. Though the methods used in both indecies are not the same, which accounts for the general level differences between the two, one can see the shape of the data is fitting to the population.


Image 4



Image 5



4. Methodology

The overarching method used in this thesis is the Hedonic Pricing Method (HPM), also often referred to as hedonic regression or hedonic demand theory. The fundamental theory behind the HPM is the following: commodities are distinguishable by their component parts, therefore, the market value of a given commodity can be calculated by summing the estimated values of its separate characteristics. For this theory to hold true, several critical requirement must be met. Primarily, that the commodity being valued can be reduced down to it’s component parts and that the market is able to implicitly and independently value these characteristics. The fulfillment of these requirements are not obvious and in reality will in some measure fall short of accounting for the complete nature of price dynamics in practically every asset class. However, this limitation offers an interesting problem to test. Namely, to find the limit of the accumulated power of these component parts to account for market values and their deviations across time and subgroups. This exact questions will be later examined by implementing a machine-learned predictive model to measure the theoretical maximum explanatory power of the included hedonic variables. In the following two subsections, we review the methods used in this paper to econometrically model the HPM on hedonic real estate data.


4.1 Multi-Variable Linear Regression

In this section, I will outline the construction of my base OLS model, termed the Alpha model, as well as the treatment process for heteroskadasticity, multicolinearity, non-linearity, and high-leverage points and outliers.

4.1.1 Basic Model Design

Following the OLS construction laid out by Herath and Maier (2010):

\[ R = f(P,N,L,t) \] where \(R\) is rent or price of the property; \(P\) is property related attributes; \(N\) is neighborhood characteristics; \(L\) is locational variables and; \(t\) is an indicator of time.

This paper’s base OLS model, named the Alpha model, is as follows:

\[ {P}_{n\times1} = \ A_{n\times1} \ + \ B_{k\times1}{V}_{n\times k} \ + \ \mathcal{E}_{n\times1} \]

where \(P\) is a \({n\times1}\) vector of sold prices; \(A\) is a \({n\times1}\) vector of the model’s intercepts; \(B\) is a \({k\times1}\) vector of beta coefficients; \(V\) is a \({n\times k}\) matrix of all hedonic variables; \(\mathcal{E}\) is a \({n\times1}\) vector of the model’s random error; subscript \(n\) is the number of observations and; \(k\) is the length of the variable list.


4.1.2 Accounting for Heteroscadasticity

A Breusch-Pagan test was conducted on a standard linear regression model with sold price as the dependent variable and the rest of the dataset as regressors. The Breusch-Pagan (BP) test was established as a method in 1979 and follows the logic set by the Lagrange multiplier test principle (Breusch and Pagan 1979). This test tests the null hypothesis that the variance in the model’s errors is independent from model’s regressors (i.e. heteroscadasticity). The test’s results in a rejections of the null hypothesis, thereby finding the base model to be heteroskedastic. The results of this test are summarized in table x.



To resolve the heteroskadasticity found in §3.4.1, I will produce heteroskedasticity-consistent (HC) standard errors, also known as heteroskedasticity-robust standard errors, through the refined method established by econometrician Halbert Lynn White (White 1980).This process is as follows:

If the model’s errors \(u_{i}\) are independent, but have distinct variances \(\sigma _{i}^{2}\) then \(\Sigma =\operatorname{diag}(\sigma _{1}^{2},\ldots ,\sigma _{n}^{2})\) which can be estimated with \({\displaystyle {\widehat {\sigma }}_{i}^{2}={\widehat {u}}_{i}^{2}}\). This relationship produces the estimator found in White (1980):


\[ {\displaystyle {\begin{aligned}v_{\text{HCE}}\left[{\widehat {\beta }}_{\text{OLS}}\right]&={\frac {1}{n}}\left({\frac {1}{n}}\sum _{i}X_{i}X_{i}'\right)^{-1}\left({\frac {1}{n}}\sum _{i}X_{i}X_{i}'{\widehat {u}}_{i}^{2}\right)\left({\frac {1}{n}}\sum _{i}X_{i}X_{i}'\right)^{-1}\end{aligned}}}\] \[{\displaystyle {\begin{aligned}&=(\mathbb {X} '\mathbb {X} )^{-1}(\mathbb {X} '\operatorname {diag} ({\widehat {u}}_{1}^{2},\ldots ,{\widehat {u}}_{n}^{2})\mathbb {X} )(\mathbb {X} '\mathbb {X} )^{-1},\end{aligned}}}\]


where \(\mathbb{X}\) denotes the matrix of stacked \(X_i'\) values from the data. The estimator can be derived in terms of the generalized method of moments (GMM).

For the remainder of this thesis, all statements and figures regarding statistical significance will be referring to tests conducted with heteroskedasticity-consistent (HC) standard errors. As sample errors in my models will have equal variance and are uncorrelated, the least-squares estimates of each model’s beta coefficients are regarded as Best Linear Unbiased Estimators (BLUEs).


4.1.3 Accounting for Multicolinearity

Multicolinearity is measured using Variance Inflation Factors (VIF). The VIF of a predictor measures how accurately that variable can be predicted using all other variables. For context, the square root of a VIF represents the increase in standard error of the estimated coefficient with respect to the case when that given variable is independent of all other variables. Inline with current convention, all variables with a VIF larger than 5 are eliminated. A graphical representation of all variable multicolinearity, measured by VIF, is shown in image x.

This test resulted in the elimination of the variables list_price and area_total and there were highly multicolinear with sold_price and area_living respectively.



4.1.4 Accounting for Non-linearities

I visual analysis was conducted on all continuous variables and non-linear variables transformation were added to age and area_living

Age:

An analysis of age vs. sold price shows a well-established u-shaped pattern. In order to allow the OLS model to better capture this relationship, a new variable \(age^2\) is added to the model.

Image x shows the Partial Dependency Plot (PDP) of age within the Alpha model. This plots the marginal prediction of the Alpha model across the full range of age. When the scale of the y-axis is reduced, we see the slight curvature in Alpha model’s estimation of age effects. This addition improved \(R^2\) by \(.08\).



Living Area:

An analysis of living-area vs. sold price reveals a Sigmoid pattern between the two variables. In order to allow the OLS model to better capture this relationship, a new variable \(living \ area^2\) is added to the model.

Image x shows the Partial Dependency Plot (PDP) of \(living \ area^2\) within the Alpha model. This addition improved \(R^2\) by \(.06\).



4.1.5 Accounting for High-Leverage Points and Outliers

After the adjustments or the previous sections have been made, a panel of visualizations are run on the Alpha model. The results show no extreme outliers and only one high-leverage point (obs #23515), as shows by the residual vs. leverage plot in quadrant two of image X, which is removed in the final Alpha model. These results are mainly due to the previous removal of outliers in §3.2 and the overall quality of the data set.



4.1.6 Final Alpha Model

Under Construction

The Alpha model is the baseline OLS for this thesis and is rebust to heteroskadasticity, multicolinearity, non-linearities, high-leverage points and outliers. These high-level adjustment increase our confidence in the statistical tests results which follow



4.3 Modeling Changes in Demand for Hedonic Features

The focus of this thesis is how the Covid crisis impacted housing prices and the relative levels of demand for specific hedonic features. In the case where the HPM is in the OLS functional form, the beta coefficients of this model represent relative demand for each associated hedonic feature (Shimizu et al. 2010). For example, \(\beta_{pool = 1} =11,856\) is interpreted as the average consumer’s willingness to pay for an average pool, ceteris parabus. However, this thesis wishes to measure the changes in the average consumer’s willingness to pay for a given feature (e.g. pool) in relationship a measurement of Covid’s economic impact.

4.3.1 Comparison Method

A method of statistically comparing changes in the beta coefficients of particular features of interest under multiple scenarios (e.g. post and pre-corona period) is needed. To accomplish this, a method outlined by the UCLA Statistics department is implemented (Bruin 2011). The best way to understand this method is to see a simplest reproducible example.

Suppose we want to test the economic impact of Corona on the relative demand for swimming pools, \(\beta_{pool = 1}\) and \(pool\) respectively. Using the UCLA method, we test the null hypothesis \(H_0:\beta_{pool = 1,\ corona = 0} = \beta_{pool = 1,\ corona = 1}\) with the following OLS


\[ {sold \ price} = \alpha \ + \beta_1 {pool} \ + \ \beta_2 {corona} \ + \beta_3 {(pool \times corona)} \]

Which results in the following:



The interpretation of this simplified model’s estimates are:

  • Intercept: Intercept for \(pool = 0\)
    • The omited group
  • pool: Slope for \(pool = 1\)
    • The included group
  • infections period: \((\)Intercept \(infections \ period = 1)\) \(-\) \((\)intercept \(infections \ period = 0)\)
    • This can be seen by running individual regressions for each case
  • (pool*infections period): Slope for \(pool_{infections \ period = 1}\) \(-\) \(pool_{infections \ period = 0}\)
    • This estimate tests the null hypothesis \(H_0: \beta_{pool = 1,\ corona = 0} = \beta_{pool = 1,\ corona = 1}\)


Therefore, we say:

The average premium for a property having a swimming pool fell by $7,766.40 when compared to pre-corona levels, ceteris parabus. However, this finding is only significant at the p < 0.10 level.


4.3.2 Selecting a Corona Measurment

A good measurement variable for measuring the response of the market to the corona crisis must be a corona-related matric which is publicly available; common knowledge to the population and; is a reasonable measurement of future economic shifts. For this reason, data collected from the Louisiana Department of Health (LaDH 2022) was used to calculate the 3-month moving average of corona infections (infections_3mma).



This measurement fulfills the previously stated requirements of a good test measurement as it is purely related to the corona crisis, is publicly available, is assumed to be publicly known as it is reported across all major news stations daily, and perhaps most importantly, is the primary metric used to decide when mandatory lockdowns are instituted. For this thesis, it is assume the market is responding to some lagged value of daily infections which are being used by consumers to estimate the likelihood of future lockdowns and the stringency, and duration of current lockdowns. With this rational, infections_3mma is selected as the primary measurement of corona’s impact.



4.4 Machine Learning

4.4.1 Machine Learning Methods

In the previous subsection 4.1, it was stated that the multivariable regression models estimate a vector of parameters (i.e. beta coefficients) that best fit the explanatory hedonic variables to the associated dependent variable. Intuitively, the resulting fitted coefficient vector is fitted to the entire data set, and therefore, the loss function minimizes the error in the model’s ability to explain the very independent variable it was fitted to. In other terms, these results are ultimately limited to their inferential value within the exact context of the data set the model is trained on. If one is to establish a wider, more general relationship between dependent and independent variables that go beyond the context of the trained data set, supervised machine learning (ML) prediction models are an extremely powerful tool to do so. Though the models used in this thesis differ across several key processes, they each generally follow a similar logic:



4.4.2 Model Evaluation with Cross-Validation

In order to rank order models, we perform a process called Cross-Validation (CV). First, the full data set must be split into ‘test’ and ‘train’ (i.e. validation) subsets. Each ML model will be fitted to the train data set and it’s performance will be evaluated based the model’s ability to predicted out-of-sample observations in the test (validation) data set. In this way, these models are ranked based on their test mean squared errors (MSE). This process is often referred to as Cross Validation (CV). The two most commonly used CV methods are the Validation Set Approach and K-Fold Cross Validation.

The Validation Set Approach (VSA) is the simplest case of cross validation data splitting as it randomly splits the entire data set into train and test subsets based on a certain percentage split. For example, the researcher can choose to split the data set with a 80% training and 20% testing split. The estimation for the test MSE is simply the test error against the test data set.


Test MSE Estimation Equation

\[CV_{vsa} = MSE_{vsa}\]



The K-Fold CV method has increasingly been used by researches as it offers a more comprehensive cross validation process when compared to other methods. K-Fold CV is the process of randomly splitting the entire data set into k groups, or folds, each with approximately an equal number of observations. The first fold is held out and the model is trained on the remaining k-1 folds. This process is repeated k times, each time holding out a different fold until every fold has been treated as the validation set. Finally, this will results in k estimations of the model’s test error and the final estimation will be the average across all k model fits.


Test MSE Estimation Equation

\[CV_{k-fold} = \frac{1}{k}\sum_{t=1}^{k} MSE_i\]



4.4.4 ML Model Selection

For this thesis, ML models will be ranked based on two features: Accuracy, as measured by test MSE, and interpretability, qualitatively defined by the model’s ability to provide insights into to which features are relevant to the ability to make correct predictions, and by how much are they relevant.

Accuracy

Since a method of model fitting and evaluation has been established in the previous section through the process of Cross Validation, we now have a way to rank different models to each other based on their ability to estimate test MSE. With this feature, it is possible to compare several models to one another in terms of effectiveness in predictions. Five different ML models were build for this thesis with the following results:



Interpretability

A major criticism of ML models are their lack of interpretabilty, explaining how the model makes such accurate predictions. A prime example of this critique can be seen in Artificial Neural Networks (ANN) machines, which often use a large number of small nodes to sequentially generate a single prediction without any one of these nodes holding a clear interpretation as to which variables, or combination of variables, lead to a particular improvement in prediction. However, as ML methods become more commonly used, the demand for interpretation of these models has driven several useful interpretation methods across for a variety of models. These methods include interpretation for a single prediction, such as the Local Interpretable Model-agnostic Explanations (LIME), as well as generalized methods of measuring relative feature importance, which uses various techniques to determine the average contribution of each variable to the model’s ability to decrease its test MSE rate.

Of the models sampled, the eXtreme Gradient Boosting Machine, also referred to as XGBoost, outperforms the other models both in terms of having the lowest test MSE and having the best methods for detailed variable interpretation. For this reason, XGBoost is chosen as the primary ML model for this thesis


4.4.5 eXtreme Gradient Boosting Machine Algorithm

In order to understand the logic of XGBoost, one must first look at the compact, yet powerful algorithm behind its computation. In this section, I will lay out the mathematical formulation of the input, core algorithm, and final output of the XGBoost machine.


  1. Algorithm input: We start with a training set \({\displaystyle \{(x_{i},y_{i})\}_{i=1}^{N}}\), a differentiable loss function \(L(y, F(x))\), a number of weak learners (shallow trees) \(M\), and a learning rate \(\alpha\).

  2. Algorithm:

2.1 Initialize model with a constant value:

\[{\displaystyle {\hat {f}}_{(0)}(x)={\underset {\theta }{\arg \min }}\sum _{i=1}^{N}L(y_{i},\theta )}\]


2.2 For \(m = 1\) to \(M\):

2.2.1 Compute the ‘gradients’ and ’hessians \[{\displaystyle {\hat {g}}_{m}(x_{i})=\left[{\frac {\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}}\right]_{f(x)={\hat {f}}_{(m-1)}(x)}}\] \[{\displaystyle {\hat {h}}_{m}(x_{i})=\left[{\frac {\partial ^{2}L(y_{i},f(x_{i}))}{\partial f(x_{i})^{2}}}\right]_{f(x)={\hat {f}}_{(m-1)}(x)}}\]


2.2.2 Fit an original weak learner (e.g. shallow tree) using the training set \({\displaystyle \{x_{i},-{\frac {{\hat {g}}_{m}(x_{i})}{{\hat {h}}_{m}(x_{i})}}\}_{i=1}^{N}}\) by solving the following optimization problem:

\[{\displaystyle {\hat {\phi }}_{m}={\underset {\phi \in \mathbf {\Phi } }{\arg \min }}\sum _{i=1}^{N}{\frac {1}{2}}{\hat {h}}_{m}(x_{i})\left[-{\frac {{\hat {g}}_{m}(x_{i})}{{\hat {h}}_{m}(x_{i})}}-\phi (x_{i})\right]^{2}}\]

\[{\displaystyle {\hat {f}}_{m}(x)=\alpha {\hat {\phi }}_{m}(x).}\]


2.3 Update the model: \[{\displaystyle {\hat {f}}_{(m)}(x)={\hat {f}}_{(m-1)}(x)+{\hat {f}}_{m}(x).}\]


  1. Algorithm Output: \[{\displaystyle {\hat {f}}(x)={\hat {f}}_{(M)}(x)=\sum _{m=0}^{M}{\hat {f}}_{m}(x)}\]


4.4.6 XGBoost Model Fitting and Hyperparameter Tuning

In practice, when attempting to produce the most optimal results from an XGBoost machine, as is true with most other ML models, one must first transform the data set into an optimal form and then run set of hyperparameter tests to determine the appropriate level for each of the model’s basic structural rules (i.e. hyperparameters).

Since the XGBoost machine requires only numerical data, factor data must be converted into numerical levels which can be the used in the construction of decision trees. To accomplish this with the added complexity of some factor variables having more than two levels, I have used a method called One-Hot Encoding, which encodes each individual factor variable level into a vector containing ‘1’ if that factor and level are present, and ‘0’ if it is not. In this way, the dataframe is converted into a large matrix of continuous and binary columns.



Once the model is fitted to the data, the next procedure is to tune the hyperparameters which govern the algorithm’s learning process and therefore determine the resulting values of estimated parameters. To do this, a large grid of hyperparameters is created and then an individual model containing each unique combination of hyperparameter levels is generated and their resulting test MSE’s are ranked and analyzed. The results from this large grid search determine which combination of hyperparameters are optimal, and those hyperparameters are used in the final model. The search grid from this research was so large, it took my computer 78 hours to complete all of the calculation necessary for the full tuning process.


4.4.7 XGBoost Partial Dependency Plots

Partial dependency plots (PDP) shows relationship, or dependence, between the model’s response variable (i.e. \(sold \ price\)) and a chosen variable, or set of variables, of interests (VoI), resulting in the graphical representation of a variables marginal contribution to the machine’s prediction across the variable of interest’s entire range. In order to analyze the results of the XGBoost machine at the variable-by-variable level, I have generate a panel of four graphical partial dependency plots for each variable of interest. Thesis will be the following: Basic PDP plot, Individual Conditional Expectation (ICE) plots, PDP heatmap with VoI against corona infection, 3-dimensional PDP heatmap with VoI against corona infection. An example of each of these graphs, using days on market as the variable of focus, can be seen in quadrants IV, I, III, and II respectively.





5. Hypothesis Construction

5.1 Covid-19: General Case

Hypothesis I: The Covid-19 crisis significantly increased housing prices

Reasoning: As many workers have perminantly shifted to remote work, the total utility of residential housing has increased, thereby increasing the price households are willing to pay. This price shift can be explained through measuring the changes if relative demand for specific hedonic features, such as bedrooms, size, age, and others.


5.2 Covid-19: Premium for Bedrooms

Hypothesis II: The Covid-19 crisis significantly increased demand-premiums for every level of number of bedrooms greater than 1

Reasoning: As many workers have perminantly shifted to remote work, the premium for an additional bedroom is expected to increase across each level of total number of bedrooms as households need additional rooms for homeoffices and other activities. The premium for a single bedroom is expected to be insignificant since there are no recorded 0-bedroom houses to upgrade from.


5.3 Covid-19: Premium for City Centrality

Hypothesis III: The Covid-19 crisis impacted properties within city limits more than those not within city limits

Reasoning: As workers who live in city limits are expected to hold jobs more likely to be compateble with remote work, such as jobs within the financial industry, home prices within city limits are disproporsionatly impacted by the shift to remote work.


5.4 Covid-19: Premium for Size

Hypothesis IV: The Covid-19 crisis increased the premium for property size

Reasoning: Same as for hypothesis I


Hypothesis V: The Covid-19 crisis impacted properties in the top 25th percentile of property size more than the bottom 25th percentile

Reasoning: Households who live in the top 25th percentile of home sizes are more likely to hold white-collar jobs, which are more likely to be made remote, which increases the premium they are willing to pay for additonal hedonic features.


5.5 Covid-19: Premium for Age

Hypothesis VI: The Covid-19 crisis decreased the premium for property age

Reasoning: As the volocity of home sales increase, the general relationship between property age and price is expected to be exasterbated as those upgrading houses will shit towards newer properties


Hypothesis VII: The Covid-19 crisis impacted properties in the top 25th percentile of age more than the bottom 25th percentile

Reasoning: The premium for the youngest (i.e. newest) properties is expected to increase while the premium for the oldest properties is expected to decrease. As the market shifts towards newer properties, they must necissarily shift away from older properties.


5.6 Covid-19: Change in Days on Market

Hypothesis VIII: The Covid-19 crisis significantly decreased the premium for days on market

Reasoning: As the volocity of home sales increase, more homes are sold faster, and therefore the number of days on the market becomes less of a predictor of quality since even lower quality and over-priced homes are sold more quickly.


Hypothesis IX: The Covid-19 crisis impacted properties in the top 25th percentile of days on market more than the bottom 25th percentile

Reasoning: The premium for a property being sold within the top 25th percentile of days on market (DOM), i.e. the properties which sit on the market the logest, is expected to be disproportionately effected when compared homes which sold the fastest, as households elasticity of demand for specific characteristics decreses relative to price, it will take larger deviation in price and quality to make a home sell in the top 25th percentile of DOM



6. Results

This section will follow a consistent structure for each set of results. Each hypothesis will have: A summary of the finding; feature review of the characteristic being modeled; and model results from the OLS and ML models with standard hypothesis conclusion(s).


6.1 Covid-19: General Case

6.1.1 Summary of Findings

Preliminary analysis of housing prices and daily infections reveals a positive historical relationship between these two key variables. This relationship is strongly supported by the XGBoost ML algorithm, which shows that a maximal reduction in predictions error is acheived by increasing prediciton price at all levels of daily infections greater than 0, holding all other factors constant. XGBoost also determined that from the 104 total variables used, daily infections is the 19th most important variable in reducing price prediction error.

In the fully controlled Alpha model, the beta coefficient for daily infections suggests that each additional infection is associated with an average home price increase of $8.97, ceteris parabus. This finding is significant at the p < 0.00 level. Therefore, we reject \(H_0: beta_{infections_3mma} = 0\). I conclude that the Covid-19 crisis significantly increased housing prices Hypothesis I).

6.1.2 Visual Review

We first look at the distribution of daily infections and the accumulation of infections across time. The variation in historical daily infections should provide a strong measurement for explaining variations in price related to this key variable.



To investigate the raw historical relationship between infections rates and prices, we look at the trend line of price vs daily infections (rhs) and a comparison between the price distributions of pre and post-infections period (lhs). These analysis suggests a historically positive relationship between infections and price. Though these graphs are promising, it is unclear if other factors could be influencing this relationship. To establish a statistical relationship, we turn to the following OLS and ML models.



6.1.3 OLS Modeling

Since displaying the full OLS output for every set of results is impractical, I will include a summarized version with only the key variables included. Please note that if you wish to see each regression output table, code, and data associated with this thesis, you can visit my public GitHub repository with the following link: https://github.com/Sawbenson15/HPM_Thesis.

In the fully controlled Alpha model, the beta coefficient for daily infections suggest that each additional infection is associated with an average home price increase of $8.97, ceteris parabus. This finding is significant at the p < 0.00 level. I therefore reject the \(H_0\) of Hypothesis I, concluding that the Covid-19 crisis significantly increased housing prices.

This foundational finding lays the groundwork for the following results, which attempt to explain the significant relationship between infections and price at the level of individual hedonic variables.




The following graphic shows the historical relationship between daily infections and sold price with a 1SD error margin at all point (in grey), the best single-variable fit (in green), and the Alpha model’s marginal fit (in blue). We see that the many controls of the Alpha model flatten the estimated marginal effect of each additional daily infection on price, however, this relationshiip remains positive and significant, as previously established.



6.1.4 ML Modeling

To further test the relevance of corona infections in determining prices, we look at this variable’s relative ranking based it’s ability to improve out-of-sample predictions within our XGboost model. The measurement used is called Variable Importance and is defined by a combination of gain, cover, and frequency. Gain is how much prediction power is gained when the variable is added to the model; cover is how heavily the variable is weighted in each iteration, and frequency is how frequently the variable appears across all iterations.

We see that of the 104 unique variables offered to the XGBoost machine, the 3-month moving average of infection was the 19th most descriptive variable in predicting prices. I consider this results non-trivial and a very strong confirmation that the relationship found in the OLS model is correct.


To get a detailed understanding of the marginal effect each additional daily infection has on price through, we look at the PDP and the ICE of infections and price. The PDP (top) shows the optimal price change w.r.t. daily infections which minimize the model’s test MSE. The ICE (bottom) is the individual PDP for every observation in the dataset, centered at infection = 0. The ICE allows us to understand the simple PDP, which is an everage of the individual ICEs, in more detail and also to pick up on any signs of heteroskedasticity among the individual sample predictions.

The PDP shows that on average, an increase in price at every level of daily infections > 0 reduces test MSE. Furthermore, this trend is generally upward trending, with a notable range of response between 1,800 and 2,500 infections, which I refer to as the infection-price ridge. Discussions regarding possible explanations for the general shape of this region will be explored in section 7.



6.2 Covid-19: Premium for Bedrooms

Foreword for this section:

There are two contextual details which must be considered for one to appropriately interpret the following findings. First, the variables for total number bedrooms and the total living area of a home are highly correlated, and therefore when total living area is included in the OLS model, the beta coefficients for each level of number of bedrooms represents the premium homeowners are willing to pay for the actual feature of an extra bedroom at a fixed living area, and not the extra living area itself. As this results in convoluted results, living area is excluded when testing the effect of bedrooms. This effectively measures the additional room and the average additional living area associated with that additional room at each level (e.g. from 1 bedroom to 2, 2 to 3, etc.). Secondly, the OLS results listed below represent the change in the premiums (i.e. beta coefficients) from post vs. pre corona and not the absolute price premiums, as in the case of measuring daily infection alone.

6.2.1 Summary of Findings

Note: add xgboost results

Prelimilary findings show that the price distribution for every level of number of bedrooms increased after the beginning of the infection period (i.e. accumulation of infections >= 1000), as predicted. The average number of total bedrooms between pre and post-infections period deviate slightly, with post-infections period being 0.003 higher. However, the key focus of this section is not absolute changes in the feature number of bedrooms, but rather in the change in premium for each level of number of bedrooms.

The fully controled Alpha model results show that the everage premium for each level of number of bedrooms significantly increased in response to increases in daily infections. Every increase found is at least significant at the p < 0.05 level except for single bedroom homes. Therefore, I reject the \(H_0:\) of hypothesis II and conclude that the Covid-19 crisis significantly increased demand-premiums for every level of number of bedrooms greater than 1. It should also be noted to the premium increase is increasing larger for at each level, suggesting that the premium for the 4th bedroom in a home increased more than the premium for the 3rd bedroom. Possible theories regarding this significant shift in premiums is explored in section 7.

6.2.2 Visual Review

General distribution of number of bedrooms per residential property.



Distributions of prices at each level of number of bedrooms (lhs) and the distributions of prices at each level of number of bedrooms split by before and after infection period (rhs).



It is also instructive to look at the same two plots above, but normalized by square footage. We see a significant flattening between each level of number of bedrooms, however, a distinct change from pre vs. post infection period is still visible (rhs). The next section will test if this shift from post to pre-corona is significantly in general, and significantly related to daily infections.



6.2.3 OLS Modeling

Under the fully controlled Alpha model, we see that corona-driven premiums changes at ever level of number of bedrooms is statistically significant except for single-bedroom properties. This finding suggest that for every additional 3-month-moving-average daily infection present at the time the property is sold is associated with an average increase of 25, 32, 37, 27, and 47 USD for levels 2-through-5 respectively.



6.2.4 ML Modeling

Due to number of bedrooms being categorical, the results of the XGBoost model for these variables are not as easily visually represented as continuous variables, which have an easier interpretation through PDPs. However, we can consider the results in written form and with adjusted graphs to represent the importance rankings.

The variable importance ranking of each factor level from 1-through-5 bedrooms is 84, 60, 47, 34, and 68 respectively from the total 104 variables used in the model. This relatively low relevance is expected, as much of the explanatory power of bedrooms on price is taken by total living area, ranked number 1 in the importance matrix. However, we see that test MSE is minimized by increasing price at each level of number of bedrooms.



6.3 Covid-19: Premium for City Centrality

Foreword for this section:

In this section, it is important to note that a property being within city limits does not mean that it should be viewed as being in the center of a major city. This categorization is better understood as a distinction from properties which are rural, such as properties on farm land and heavily wooded or otherwise remote areas. It should also be noted that results at several levels of analysis will be discussed, such as nonimal differences in the populations, price reactions to daily infections for each sub-population, and the change in premium for being within city limits.

6.3.1 Summary of Findings

Preliminary analysis of city centrality’s impact on home prices shows that homes within city limits have a higher price on average when compared to rural properties. Further visual analysis suggests that prices grew in both sub-populations post vs. pre-infection period, with city-cintral properties experincing the larger nominal shift in average prices. The XGBoost model shows that an increase in prediction price when a property is within city limits maximally reduces the model’s test MSE, sugesting this variable is a generally important feature, with a ranking of 42 in the importance matrix.

In the fully controlled Alpha model, the coefficient for daily infections and city limits suggests that each additional infection is associated with an average increase of $5.17 in the premium for being located within city limits compared to property not within city limits, ceteris parabus. This finding is significant at the p < 0.00 level. Therefore, I reject the \(H_0:\) of hypothesis III and conclude that the Covid-19 crisis impacted properties within city limits more than those not within city limits.

6.3.2 Visual Review


To better understand the effect corona had on properties specifically located within city limits, I split the city_limits distribution by infection periods. This separation shows a clear increase in association with the infections period.


6.3.3 OLS Modeling

First, we look at the main result which tests the change in premium for being within city limits, in constrast to rural properties, before vs. after infection period. This finding shows each additional infection is associated with an average city_limts premium increase of $5.17 compared to property not within city limits, ceteris parabus. This finding is significant at the p < 0.00 level.



To further highlight the differences in corona’s impact of properties within city limits vs outside of city limits, I ran a separate regression model for each sub-population with all of the standard controls of the Alpha model to see the impact of daily infections on prices. This results shows that properties within city limits (lhs) have an average increase of $9.15 per additional daily infection which is significant at the p < 0.00 level, while the model for rural properties (rhs) shows that daily infections is not a significant variable in explaining variations in prices. It should also be noted how much smaller the number of observations is in the rural model.



6.3.4 ML Modeling


The XGBoost PDP of the city_limits dummy variable shows that increasing property value when the property is within city limits maximally reduces test MSE.


6.4 Covid-19: Premium for Size

6.4.1 Summary of Findings

An analysis of size shows that this feature is smoothly distributed across the data set with the average total living area marginally higher in the post-infections period. The XGBoost model rankes this feature as the number one most impartant variable in predicting prices.

In the fully controlled Alpha model, the coefficient for daily infections and total living area suggests that each additional infection is associated with an average premium increase of $0.02 for total living area, measured per square foot, ceteris parabus. This finding is significant at the p < 0.00 level. Therefore, I reject the \(H_0:\) of hypothesis IV and conclude that the Covid-19 crisis increased the premium for property size.

Furthermore, I have run a separate Alpha model for the top and bottom 25th percentile of total living area. These results show that the premium for the smallest homes decreases per additional daily infection (-3.15 USD, p < 0.00), while homes in the top 25th percentile increase with respect to daily infections (-3.15 USD, p < 0.00). This suggests a shift away from smaller homes and towards larger homes in response to the corona crisis. Therefore, I reject the \(H_0:\) of hypothesis V and conclude that the Covid-19 crisis impacted properties in the top 25th percentile of property size more than the bottom 25th

6.4.2 Visual Review

Total living area is relatively smoothly distributed across the data set with the average total living area marginally higher in the post-infections period. Since this feature is roughly stable in the short run, this result is expected.



Price distribution, however, differ between pre and post-infection period when normalized by per square foot (sqft.).


6.4.3 OLS Modeling

The fully controlled Alpha model shows the coefficient for daily infections and total living area suggests that each additional infection is associated with an average premium increase of $0.02 for total living area, measured per square foot, ceteris parabus. This finding is significant at the p < 0.00 level.



To further test this relationship, I have run a separate Alpha model for the top and bottom 25th percentile of total living area. These results show that the premium for the smallest homes decreases per additional daily infection (-3.15 USD, p < 0.00), while homes in the top 25th percentile increase with respect to daily infections (-3.15 USD, p < 0.00). This suggests a shift away from smaller homes and towards larger homes in response to the corona crisis.


6.4.4 ML Modeling

The PDP and ICE plots show a stable and consistant increase in prices as total living area increases.


The heatmaps of predicted price with respect to daily infections and total living area show that both variables consistently increase XGBoost’s price predictions, with the Maximal Price Region (MPR) at the top 25th percentile of both variables.


6.5 Covid-19: Premium for Age

6.5.1 Summary of Findings

A preliminary analysis of age shows that this feature is different in the pre and post-infections periods, with the lower average age of homes sold in the post-infection period suggesting that home owners prefere, on average, newer homes. The XGBoost model rankes this feature as the second most impartant variable in predicting prices.

In the fully controlled Alpha model, the coefficient for daily infections and age suggests that each additional daily infection is associated with an average premium decrease of $0.06 for each aditional year of age, ceteris parabus. This result can be interpreted as an increase in the penilty per additonal year of age, making older home even more undisirable post-infections period. This finding is significant at the p < 0.00 level. Therefore, I reject the \(H_0:\) of hypothesis VI and conclude that The Covid-19 crisis decreased the premium for property age.

Furthermore, I have run a separate Alpha model for the top and bottom 25th percentile of age. These results show that the premium for the oldest homes decreases per additional daily infection (-2.75 USD, p < 0.00), while the premium for being in the bottom 25th percentile of age (i.e. newest homes) is not significantly different pre vs post-infection period. This suggests a distinct shift away from older homes in response to the corona crisis. Therefore, I reject the \(H_0:\) of hypothesis VII and conclude that the Covid-19 crisis impacted properties in the top 25th percentile of property age more than the bottom 25th.

6.5.2 Visual Review

The graph below highlights the differences in the age distributions between the pre and post infections period groups. We see a decrease in the average age in homes sold in the post-infection period.



6.5.3 OLS Modeling

Alpha model, finds that each additional daily infection is associated with an average premium decrease of $0.06 for each additional year of age, ceteris parabus. This result can be interpreted as an increase in the penalty per additional year of age, making older home even more undesirable in the post-infections period. This finding is significant at the p < 0.00 level.


Two separate Alpha models for the top and bottom 25th percentile of age show that the premium for the oldest homes decreases per additional daily infection (-2.75 USD, p < 0.00), while the premium for being in the bottom 25th percentile of age (i.e. newest homes) is not significantly different pre vs post-infection period. This suggests that home owners shifted distictly away from older homes more than towards newer homes.



6.5.4 ML Modeling

The XGBoost model’s PDP and ICE plots show the expected convexed shape between age and price predictions with an inflection point at approximatly 65 years. Since the vast majority of properties sold in my time sample are between the ages of 0 and 55 years old (94%), the downward relationship between age and price prediciton is most relivent for this paper.



To better understand the marginal impact of age and daily infections on predicted home prices, we turn to the heat maps below. It can be seen that the highest marginal price additions happen in the region: 0 < age < 10 and 1800 < infections < 2300.



6.6 Covid-19: Change in Days on Market

Foreword for this section:

Days on market (DOM) is a strange variable as it is relationship to the final selling price of a home is not unidirectional. This is because the number of days a home sits on the market is greatly determined by the relationship between the original listing price and the actual market value of the home, with over-priced homes taking longer to sell and under-priced homes less time. However, it is also the case that people will to wait for the right buyer to come along will be rewarded by selling their home at a higher price. This feedback loop makes standard econometric interpretations difficult and the folloiwng results in this section should be analyzed with this fact in mind.

6.6.1 Summary of Findings

A preliminary analysis of DOM shows that this feature noticably shifted in the post-infection period, with the average DOM being lower when campaired to the pre-infections period. Of the 104 variables used to train the XGBoost model, DOM is ranked as the 8th most impartant variable in predicting prices.

In the fully controlled Alpha model, the coefficient for daily infections and DOM suggests that each additional daily infection is associated with an average premium decrease of $0.04 for each aditional day a property sits on the market before being sold, ceteris parabus. This result can be interpreted as an increase in the penilty per additonal day on the market. This finding is significant at the p < 0.00 level. Therefore, I reject the \(H_0:\) of hypothesis VIII and conclude that the Covid-19 crisis significantly decreased the premium for days on market

Furthermore, I have run a separate Alpha model for the top and bottom 25th percentile of DOM. These results show that the negative premium for the homes which sat on the market the longest decreased (-2.75 USD, p < 0.00), while the premium for being in the bottom 25th percentile (i.e. homes sold the fastest) is not significantly different pre vs post-infection period. Therefore, I reject the \(H_0:\) of hypothesis IX and conclude that the Covid-19 crisis impacted properties in the top 25th percentile of property age more than the bottom 25th.

6.6.2 Visual Review


The preliminary graphical analysis of DOM shows a clear average decrease of DOM for homes sold in the post-infection period.


6.6.3 OLS Modeling

Alpha model, the interaction coefficient for daily infections and DOM suggests that each additional daily infection is associated with an average premium decrease of $0.04 for each additional day a property sits on the market before being sold, ceteris parabus. This result can be interpreted as an increase in the penalty per additonal day on the market. This finding is significant at the p < 0.00 level.



Separate Alpha models for the top and bottom 25th percentile of DOM. These results show that the negative premium for the homes which sat on the market the longest decreased (-2.75 USD, p < 0.00), while the premium for being in the bottom 25th percentile (i.e. homes sold the fastest) is not significantly different pre vs post-infection period.



6.6.4 ML Modeling

PDP and ICE graphs show a sharp initial decrease in prediction prices ad then a consistent downward trend. The end behavior at the top of DOM is explained by a small number of observation at the extreme and can therefore be ignored.



The heatmaps for DOM and daily infections show that properties sold at approximately 0 DOM and within the infection-price ridge are predicted to have the highest price.



6.7 Summary of Results and Hypothesis

6.7.1 Covid-19: General Case

Hypothesis I: The Covid-19 crisis significantly increased housing prices

Results:


6.7.2 Covid-19: Premium for Bedrooms

Hypothesis II: The Covid-19 crisis significantly increased demand-premiums for every level of number of bedrooms greater than 1

Results:


6.7.3 Covid-19: Premium for City Centrality

Hypothesis III: The Covid-19 crisis impacted properties within city limits more than those not within city limits

Results:


6.7.4 Covid-19: Premium for Size

Hypothesis IV: The Covid-19 crisis increased the premium for property size

Results:


Hypothesis V: The Covid-19 crisis impacted properties in the top 25th percentile of property size more than the bottom 25th percentile

Results:


6.7.5 Covid-19: Premium for Age

Hypothesis VI: The Covid-19 crisis decreased the premium for property age

Results:


Hypothesis VII: The Covid-19 crisis impacted properties in the top 25th percentile of age more than the bottom 25th percentile

Results:


6.7.6 Covid-19: Change in Days on Market

Hypothesis VIII: The Covid-19 crisis significantly decreased the premium for days on market

Results:


Hypothesis IX: The Covid-19 crisis impacted properties in the top 25th percentile of days on market more than the bottom 25th percentile

Results:



7. Discussion

Under construction

Note: Provide an outlook of the future developments of the particular scientific discussion, discuss policy implications and point out open questions.



8. Conclusion

Under construction

The purpose of this thesis is to understand the economic impact the Covid-19 crisis had on housing prices and how these impacts changed the relative demand of homeowners for certain hedonic features of a home using Louisiana, USA market data. To determine which variables would be important to analyze, an eXtreme Gradient Boost (XGBoost) machine learning algorithm was trained on a large (i.e. \(104\times24412\)) dataset of hedonic features. An analysis of the XGBoost’s variable-importance ranking shows that number of bedrooms, city centrality, total living area, age, and days on the market were among the top most important variables in determine a homes market price. Therefore, a deeper dive into how the crisis impacted the relative demand for these features is critically important in understanding the bigger picture of Covid-19’s impact on the housing market.

A panel of analysis shows that Covid-19, measured by the daily 3-month moving average of official infections at the time of sale, significantly increased average home prices by 8.97 USD per additional daily infection. This finding establishes the corona-specific reaction of housing market prices to daily infections. When analyzing how this price shift is explained by specific demand for certain property characteristics, I find: the premiums for each level of number of bedrooms is significantly increased in response to daily infections, with an average increase of 32, 37, 27, and 47 USD per additional daily infection for levels 2-through-5 bedrooms respectively; the premimum for being central to a city increased by 5.17 USD per daily infection while properties located outside the city were not significantly impacted by daily infections; premiums for home size increased by 0.02 USD per daily infection, with the premium for the smallest homes being significantly decreased by 3.15 USD per daily infection; premiums for property age, which are historically negative, decreased even further with the penalty for each additional year of age increasing by 0.06 USD per daily infections with the oldest homes experiencing the largest loss of 2.75 USD per daily infection, per year of age and; an increase in the penalty for each additional day a home sits on the market of 0.04 USD per daily infection with homes sitting the longest period of time on the market experiencing the largest loss of 2.75 per daily infection, per day.

These findings describe the ideal home to own during the crisis is a newly built, 3,000 sqft. of living area, 5-bedroom house centrally located to the nearest city which is sold in 0 days once made publicly available for sale.

What methods I used to get results results conclusion of those results Connection Call to action



9. Bibliography



9. Appendix






End of Document

Anguita, Davide, Alessandro Ghio, Noemi Greco, Luca Oneto, and Sandro Ridella. 2010. “Model Selection for Support Vector Machines: Advantages and Disadvantages of the Machine Learning Theory.” In The 2010 International Joint Conference on Neural Networks (IJCNN), 1–8. IEEE. https://doi.org/10.1109/IJCNN.2010.5596450.
Anissanti, Meita. 2021. “The Link Between GDP Growth and the Real Estate Market.” Asia Green Real Estate, November. https://www.asiagreen.com/en/news-insights/the-link-between-gdp-growth-and-the-real-estate-market.
Arnold, Mark J., and Kristy E. Reynolds. 2003. “Hedonic Shopping Motivations.” Journal of Retailing 79 (January): 77–95. https://doi.org/10.1016/S0022-4359(03)00007-1.
BAO, Helen X. H., and Cynthia M. GONG. 2016. “ENDOWMENT EFFECT AND HOUSING DECISIONS.” International Journal of Strategic Property Management 20 (December): 341–53. https://doi.org/10.3846/1648715X.2016.1192069.
Bernasconi, Michele, Luca Corazzini, and Raffaello Seri. 2014. “Reference Dependent Preferences, Hedonic Adaptation and Tax Evasion: Does the Tax Burden Matter?” Journal of Economic Psychology 40 (February): 103–18. https://doi.org/10.1016/j.joep.2013.01.005.
Berry, Brian J. L., and Robert S. Bednarz. 1975. “A Hedonic Model of Prices and Assessments for Single-Family Homes: Does the Assessor Follow the Market or the Market Follow the Assessor?” Land Economics 51 (February): 21. https://doi.org/10.2307/3145138.
Bingyang, L V, Mao Jie, and L V Yinhan. 2013. “Incentive Mechanism for Governments in the Market of Real Estate: Problems and Reforms.” Finance &Amp; Trade Economics, 7.
Breusch, T. S., and A. R. Pagan. 1979. “A Simple Test for Heteroscedasticity and Random Coefficient Variation.” Econometrica 47 (September): 1287. https://doi.org/10.2307/1911963.
Bruin, J. 2011. “Newtest: Command to Compute New Test @ONLINE.” http://www.ats.ucla.edu/stat/stata/ado/analysis/.
Clapp, John M., and Carmelo Giaccotto. 1998. “Residential Hedonic Models: A Rational Expectations Approach to Age Effects.” Journal of Urban Economics 44 (November): 415–37. https://doi.org/10.1006/juec.1997.2076.
Collett, David, Colin Lizieri, and Charles Ward. 2003. “Timing and the Holding Periods of Institutional Real Estate.” Real Estate Economics 31 (June): 205–22. https://doi.org/10.1111/1540-6229.00063.
Cowling, Keith, and John Cubbin. 1972. “Hedonic Price Indexes for United Kingdom Cars.” The Economic Journal 82 (September): 963. https://doi.org/10.2307/2230261.
Curcuru, Stephanie, John Heaton, Deborah Lucas, and Damien Moore. 2010. “Heterogeneity and Portfolio Choice: Theory and Evidence.” Handbook of Financial Econometrics: Tools and Techniques, 337–82. https://doi.org/10.1016/B978-0-444-50897-3.50009-2.
Du, Hongyan, Yongkai Ma, and Yunbi An. 2011. “The Impact of Land Policy on the Relation Between Housing and Land Prices: Evidence from China.” The Quarterly Review of Economics and Finance 51 (February): 19–27. https://doi.org/10.1016/j.qref.2010.09.004.
Dulberger, Ellen R. 1987. “THE APPLICATION OF AN HEDONIC MODEL TO a QUALITY ADJUSTED PRICE INDEX FOR COMPUTER PROCESSORS.”
Dutta, Sourav. 2018. “An Overview on the Evolution and Adoption of Deep Learning Applications Used in the Industry.” WIREs Data Mining and Knowledge Discovery 8 (July). https://doi.org/10.1002/widm.1257.
Epple, Dennis. 1987. “Hedonic Prices and Implicit Markets: Estimating Demand and Supply Functions for Differentiated Products.” Journal of Political Economy 95 (February): 59–80. https://doi.org/10.1086/261441.
FRED. 2021. “Gross Domestic Product.” Federal Reserve Bank of the USA. https://fred.stlouisfed.org/series/GDP.
Gardiner, Brian. 1997. “Squatters’ Rights and Adverse Possession: A Search for Equitable Application of Property Laws.” Ind. Int’l &Amp; Comp. L. Rev. 8: 119.
Goodman, A. C. 1978. “Hedonic Prices, Price Indices and Housing Markets.” Journal of Urban Economics, 471–84.
Gouriéroux, Christian, and Anne Laferrère. 2009. “Managing Hedonic Housing Price Indexes: The French Experience.” Journal of Housing Economics 18 (September): 206–13. https://doi.org/10.1016/j.jhe.2009.07.012.
Guilkey, David, Mike Miles, and Rebel Cole. 1989. “The Motivation for Institutional Real Estate Sales and Implications for Asset Class Returns.” Real Estate Economics 17 (March): 70–86. https://doi.org/10.1111/1540-6229.00474.
Herath, Shanaka, and Gunther Maier. 2010. “The Hedonic Price Method in Real Estate and Housing Market Research: A Review of the Literature.”
Holbrook, Morris B., and Elizabeth C. Hirschman. 1982. “The Experiential Aspects of Consumption: Consumer Fantasies, Feelings, and Fun.” Journal of Consumer Research 9 (September): 132. https://doi.org/10.1086/208906.
Hoy, Michael, and Emmanuel Jimenez. 1991. “Squatters’ Rights and Urban Development: An Economic Perspective.” Economica 58 (February): 79. https://doi.org/10.2307/2554976.
Kahneman, Daniel, Jack L Knetsch, and Richard H Thaler. 1990. “Experimental Tests of the Endowment Effect and the Coase Theorem.” Journal of Political Economy 98: 1325–48.
LaDH. 2022. “Louisiana Department of Health: Covid-19 Information @ONLINE.” https://ldh.la.gov/Coronavirus/.
LeSage, James P., and R. Kelley Pace. 2004. “Models for Spatially Dependent Missing Data.” The Journal of Real Estate Finance and Economics 29 (September): 233–54. https://doi.org/10.1023/B:REAL.0000035312.82241.e4.
LING, DAVID C., JOSEPH T. L. OOI, and THAO T. T. LE. 2015. “Explaining House Price Dynamics: Isolating the Role of Nonfundamentals.” Journal of Money, Credit and Banking 47 (March): 87–125. https://doi.org/10.1111/jmcb.12194.
Locke, John, and Wolfram Engels. 1691. Some Considerations of the Consequences of the Lowering of Interest, and Raising the Value of Money. Verlag Wirtschaft und Finanzen.
Manhertz, Treh. 2021. “The u.s. Housing Market Gained More Value in 2020 Than in Any Year Since 2005.” Zillow Research. https://www.zillow.com/research/zillow-total-housing-value-2020-28704/.
Matas, Anna, and Josep-Lluis Raymond. 2009. “Hedonic Prices for Cars: An Application to the Spanish Car Market, 1981–2005.” Applied Economics 41 (October): 2887–2904. https://doi.org/10.1080/00036840701720945.
McKibbin, Warwick J., and Roshen Fernando. 2020. “Global Macroeconomic Scenarios of the COVID-19 Pandemic.” SSRN Electronic Journal. https://doi.org/10.2139/ssrn.3635103.
Mohd, Thuraiya, Nur Syafiqah Jamil, Noraini Johari, Lizawati Abdullah, and Suraya Masrom. 2020. “An Overview of Real Estate Modelling Techniques for House Price Prediction.” Charting a Sustainable Future of ASEAN in Business and Social Sciences, 321–38. https://doi.org/10.1007/978-981-15-3859-9_28.
Moulton, Brent R. 1996. “Bias in the Consumer Price Index: What Is the Evidence?” Journal of Economic Perspectives 10 (November): 159–77. https://doi.org/10.1257/jep.10.4.159.
Nanda, Anupam, Sotirios Thanos, Eero Valtonen, Yishuang Xu, and Razieh Zandieh. 2021. “Forced Homeward: The COVID-19 Implications for Housing.” Town Planning Review 92 (January): 25–31. https://doi.org/10.3828/tpr.2020.79.
Nicolaides, Phedon. 1988. “Limits to the Expansion of Neoclassical Economics.” Cambridge Journal of Economics 12: 313–28.
Pace, R. Kelley, and Otis W. Gilley. 1998. “Generalizing the OLS and Grid Estimators.” Real Estate Economics 26 (June): 331–47. https://doi.org/10.1111/1540-6229.00748.
Pagourtzi, Elli, Vassilis Assimakopoulos, Thomas Hatzichristos, and Nick French. 2003. “Real Estate Appraisal: A Review of Valuation Methods.” Journal of Property Investment & Finance 21 (August): 383–401. https://doi.org/10.1108/14635780310483656.
Schultze, Charles L. 2003. “The Consumer Price Index: Conceptual Issues and Practical Suggestions.” Journal of Economic Perspectives 17 (February): 3–22. https://doi.org/10.1257/089533003321164921.
Shimizu, Chihiro, Hideoki Takatsuji, Hiroya Ono, and Kiyohiko G. Nishimura. 2010. “Structural and Temporal Changes in the Housing Market and Hedonic Housing Price Indices.” International Journal of Housing Markets and Analysis 3 (October): 351–68. https://doi.org/10.1108/17538271011080655.
Sirmans, G. Stacy, Lynn MacDonald, David A. Macpherson, and Emily Norman Zietz. 2006. “The Value of Housing Characteristics: A Meta Analysis.” The Journal of Real Estate Finance and Economics 33 (November): 215–40. https://doi.org/10.1007/s11146-006-9983-5.
Tajani, Francesco, Felicia Di Liddo, Maria Rosaria Guarini, Rossana Ranieri, and Debora Anelli. 2021. “An Assessment Methodology for the Evaluation of the Impacts of the COVID-19 Pandemic on the Italian Housing Market Demand.” Buildings 11 (November): 592. https://doi.org/10.3390/buildings11120592.
Turing, Alan Mathison. 1950. “Mind.” Mind 59: 433–60.
Wakefield, Robin L, and Dwayne Whitten. 2006. “Mobile Computing: A User Study on Hedonic/Utilitarian Mobile Device Usage.” European Journal of Information Systems 15 (June): 292–300. https://doi.org/10.1057/palgrave.ejis.3000619.
Wallace, Nancy E, and Richard A Meese. 1997. “The Construction of Residential Housing Price Indices: A Comparison of Repeat-Sales, Hedonic-Regression, and Hybrid Approaches.” The Journal of Real Estate Finance and Economics 14: 51–73.
Wheaton, William C. 1999. “Real Estate "Cycles": Some Fundamentals.” Real Estate Economics 27 (June): 209–30. https://doi.org/10.1111/1540-6229.00772.
White, Halbert. 1980. “A Heteroskedasticity-Consistent Covariance Matrix Estimator and a Direct Test for Heteroskedasticity.” Econometrica 48 (May): 817. https://doi.org/10.2307/1912934.
WHO. 2021. “Covid19.who.int.” World Health Emergency Dashboard WHO. https://covid19.who.int/table.
LS0tCnRpdGxlOiBBbiBFbXBlcmljYWwgRWNvbm9taWMgSW52ZXN0aWdhdGlvbiBpbnRvIENPVklELTE5J3MgSW1wYWN0IG9uIEZ1bmRlbWVudGFsIEhlZG9uaWMKICBGZWF0dXJlcyBpbiBSZWFsIEVzdGF0ZSBWYWx1YXRpb24gTW9kZWxzIFVzaW5nIE1hY2hpbmUgTGVhcm5pbmcgTWV0aG9kcwphdXRob3I6ICJTYXd5ZXIgTS4gQmVuc29uIgpkYXRlOiAiRGVjZW1iZXIgMjEsIDIwMjEiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKYmlibGlvZ3JhcGh5OiBsaWJyYXJ5LmJpYgpsaW5rLWNpdGF0aW9uczogeWVzCi0tLQoKPGJyPjxicj4KCiMjIyBDaGVjayBMaXN0CgoqIExhYmVsIHRhYmxlcyBhbmQgZ3JhcGhpY3MKKiBNYWtlIHJlbGF0aW9uc2hpcCB0byBMb3Vpc2lhbmEgY2xlYXIKKiBVc2Ugb25lIHBlcnNvbiAoSSwgb3IgbWUsIG9yIHdlKQoqIENoZWNrIHNlY3Rpb24gbnVtYmVyaW5nCiogU3BlbGwgY2hlY2sKKiBVc2Ugc2FtZSB0ZXJtIGZvciBjb3JvbmEgdGhlIHdob2xlIHdheSB0aHJvdWdoCiogQ2hlY2sgZm9yIHBsYWdpYXJpc20gCiogTWFrZSB2aWRlbyBleHBsYWluaW5nIHRoZXNpcyBmb3IgcHJvZi4gZ3JhZGluZwoKPGJyPjxicj4KCiMjIyBDb3ZlciBQYWdlCgpVbmRlciBjb25zdHJ1Y3Rpb24KCjxicj4KCiMjIyBBYnN0cmFjdApVbmRlciBjb25zdHJ1Y3Rpb24KClRoZSBwdXJwb3NlIG9mIHRoaXMgdGhlc2lzIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGVjb25vbWljIGltcGFjdCB0aGUgQ292aWQtMTkgY3Jpc2lzIGhhZCBvbiBob3VzaW5nIHByaWNlcyBhbmQgaG93IHRoZXNlIGltcGFjdHMgY2hhbmdlZCB0aGUgcmVsYXRpdmUgZGVtYW5kIG9mIGhvbWVvd25lcnMgZm9yIGNlcnRhaW4gaGVkb25pYyBmZWF0dXJlcyBvZiBhIGhvbWUuIFRvIGRldGVybWluZSB3aGljaCB2YXJpYWJsZXMgd291bGQgYmUgaW1wb3J0YW50IHRvIGFuYWx5emUsIGFuICplWHRyZW1lIEdyYWRpZW50IEJvb3N0KiAoWEdCb29zdCkgbWFjaGluZSBsZWFybmluZyBhbGdvcml0aG0gd2FzIHRyYWluZWQgb24gYSBsYXJnZSAoaS5lLiAkMTA0XHRpbWVzMjQ0MTIkKSBkYXRhc2V0IG9mIGhlZG9uaWMgZmVhdHVyZXMgZnJvbSBMb3Vpc2lhbmEsIFVTQSBtYXJrZXQgZGF0YS4gQW4gYW5hbHlzaXMgb2YgdGhlIFhHQm9vc3QncyB2YXJpYWJsZS1pbXBvcnRhbmNlIHJhbmtpbmcgc2hvd3MgdGhhdCBudW1iZXIgb2YgYmVkcm9vbXMsIGNpdHkgY2VudHJhbGl0eSwgdG90YWwgbGl2aW5nIGFyZWEsIGFnZSwgYW5kIGRheXMgb24gdGhlIG1hcmtldCB3ZXJlIGFtb25nIHRoZSB0b3AgbW9zdCBpbXBvcnRhbnQgdmFyaWFibGVzIGluIGRldGVybWluZSBhIGhvbWVzIG1hcmtldCBwcmljZS4gVGhlcmVmb3JlLCBhIGRlZXBlciBkaXZlIGludG8gaG93IHRoZSBjcmlzaXMgaW1wYWN0ZWQgdGhlIHJlbGF0aXZlIGRlbWFuZCBmb3IgdGhlc2UgZmVhdHVyZXMgaXMgY3JpdGljYWxseSBpbXBvcnRhbnQgaW4gdW5kZXJzdGFuZGluZyB0aGUgYmlnZ2VyIHBpY3R1cmUgb2YgQ292aWQtMTkncyBpbXBhY3Qgb24gdGhlIGhvdXNpbmcgbWFya2V0LgoKQSBwYW5lbCBvZiBhbmFseXNpcyBzaG93cyB0aGF0IENvdmlkLTE5LCBtZWFzdXJlZCBieSB0aGUgZGFpbHkgMy1tb250aCBtb3ZpbmcgYXZlcmFnZSBvZiBvZmZpY2lhbCBpbmZlY3Rpb25zIGF0IHRoZSB0aW1lIG9mIHNhbGUsIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGF2ZXJhZ2UgaG9tZSBwcmljZXMgYnkgKjguOTcgVVNEKiBwZXIgYWRkaXRpb25hbCBkYWlseSBpbmZlY3Rpb24uIFRoaXMgZmluZGluZyBlc3RhYmxpc2hlcyB0aGUgY29yb25hLXNwZWNpZmljIHJlYWN0aW9uIG9mIGhvdXNpbmcgbWFya2V0IHByaWNlcyB0byBkYWlseSBpbmZlY3Rpb25zLiBXaGVuIGFuYWx5emluZyBob3cgdGhpcyBwcmljZSBzaGlmdCBpcyBleHBsYWluZWQgYnkgc3BlY2lmaWMgZGVtYW5kIGZvciBjZXJ0YWluIHByb3BlcnR5IGNoYXJhY3RlcmlzdGljcywgSSBmaW5kOiB0aGUgcHJlbWl1bXMgZm9yIGVhY2ggbGV2ZWwgb2YgbnVtYmVyIG9mIGJlZHJvb21zIGlzIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGluIHJlc3BvbnNlIHRvIGRhaWx5IGluZmVjdGlvbnMsIHdpdGggYW4gYXZlcmFnZSBpbmNyZWFzZSBvZiAqMzIsIDM3LCAyNywgYW5kIDQ3IFVTRCogcGVyIGFkZGl0aW9uYWwgZGFpbHkgaW5mZWN0aW9uIGZvciBsZXZlbHMgMi10aHJvdWdoLTUgYmVkcm9vbXMgcmVzcGVjdGl2ZWx5OyB0aGUgcHJlbWltdW0gZm9yIGJlaW5nIGNlbnRyYWwgdG8gYSBjaXR5IGluY3JlYXNlZCBieSAqNS4xNyBVU0QqIHBlciBkYWlseSBpbmZlY3Rpb24gd2hpbGUgcHJvcGVydGllcyBsb2NhdGVkIG91dHNpZGUgdGhlIGNpdHkgd2VyZSBub3Qgc2lnbmlmaWNhbnRseSBpbXBhY3RlZCBieSBkYWlseSBpbmZlY3Rpb25zOyBwcmVtaXVtcyBmb3IgaG9tZSBzaXplIGluY3JlYXNlZCBieSAqMC4wMiBVU0QqIHBlciBkYWlseSBpbmZlY3Rpb24sIHdpdGggdGhlIHByZW1pdW0gZm9yIHRoZSBzbWFsbGVzdCBob21lcyBiZWluZyBzaWduaWZpY2FudGx5IGRlY3JlYXNlZCBieSAqMy4xNSBVU0QqIHBlciBkYWlseSBpbmZlY3Rpb247IHByZW1pdW1zIGZvciBwcm9wZXJ0eSBhZ2UsIHdoaWNoIGFyZSBoaXN0b3JpY2FsbHkgbmVnYXRpdmUsIGRlY3JlYXNlZCBldmVuIGZ1cnRoZXIgd2l0aCB0aGUgcGVuYWx0eSBmb3IgZWFjaCBhZGRpdGlvbmFsIHllYXIgb2YgYWdlIGluY3JlYXNpbmcgYnkgKjAuMDYgVVNEKiBwZXIgZGFpbHkgaW5mZWN0aW9ucyB3aXRoIHRoZSBvbGRlc3QgaG9tZXMgZXhwZXJpZW5jaW5nIHRoZSBsYXJnZXN0IGxvc3Mgb2YgKjIuNzUgVVNEKiBwZXIgZGFpbHkgaW5mZWN0aW9uLCBwZXIgeWVhciBvZiBhZ2UgYW5kOyBhbiBpbmNyZWFzZSBpbiB0aGUgcGVuYWx0eSBmb3IgZWFjaCBhZGRpdGlvbmFsIGRheSBhIGhvbWUgc2l0cyBvbiB0aGUgbWFya2V0IG9mICowLjA0IFVTRCogcGVyIGRhaWx5IGluZmVjdGlvbiB3aXRoIGhvbWVzIHNpdHRpbmcgdGhlIGxvbmdlc3QgcGVyaW9kIG9mIHRpbWUgb24gdGhlIG1hcmtldCBleHBlcmllbmNpbmcgdGhlIGxhcmdlc3QgbG9zcyBvZiAqMi43NSogcGVyIGRhaWx5IGluZmVjdGlvbiwgcGVyIGRheS4KCjxicj4KCiMjIyAgICAgVGFibGUgb2YgQ29udGVudHMKCjEuICoqSW50cm9kdWN0aW9uKioKMi4gKipMaXRlcmF0dXJlIFJldmlldyoqCjMuICoqRGF0YSoqCjQuICoqTWV0aG9kb2xvZ3kqKgo1LiAqKlJlc3VsdHMqKgo2LiAqKkRpc2N1c3Npb24qKgo3LiAqKkNvbmNsdXNpb24qKgo4LiAqKkJpYmxpb2dyYXBoeSoqCjkuICoqQXBwZW5kaXgqKgoKPGJyPgoKIyMjIEZpZ3VyZXMsIFRhYmxlcywgYW5kIEFiYnJldmlhdGlvbnMKVW5kZXIgY29uc3RydWN0aW9uCgo8YnI+PGJyPgoKIyMjIDEuIEludHJvZHVjdGlvbgoKSW4gbGF0ZSAyMDE5LCBhIHZpcnVzIGZpcnN0IGRldGVjdGVkIGluIFd1aGFuLCBDaGluYSB3b3VsZCBzZXQgaW4gbW90aW9uIGEgZ2xvYmFsIHBhbmRlbWljIHdoaWNoLCBieSB0aGUgZW5kIG9mIDIwMjEsIHdpbGwgaGF2ZSBraWxsZWQgNC4zIG1pbGxpb24gcGVvcGxlLCBpbmZlY3RpbmcgMjM4IG1pbGxpb24gb3RoZXJzLCBhbmQgZGlzcnVwdGluZyB0aGUgZ2xvYmFsIGVjb25vbXkgYWNyb3NzIHZpcnR1YWxseSBldmVyeSBtZWFzdXJhYmxlIGRpbWVuc2lvbiBbQFdIT0RlYXRoXS4gQWNjb3JkaW5nIHRvIHNldmVuIGVjb25vbWljIGltcGFjdCBtb2RlbHMgY29uc3RydWN0ZWQgYnkgQE1jS2liYmluLCBlc3RpbWF0ZXMgb2YgdGhlIHRvdGFsIGdsb2JhbCBlY29ub21pYyBsb3NzIGluIHRlcm1zIG9mIEdEUCBhcmUgbWVhc3VyZWQgdG8gYmUgYXMgbGFyZ2UgYXMgOS4yIHRyaWxsaW9uIFVTRC4gSG93ZXZlciwgZGVzcGl0ZSBhIGdlbmVyYWxseSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIEdEUCBhbmQgcmVhbCBlc3RhdGUgcHJpY2VzIChzZWUgZmlndXJlIDEpLCBoaXN0b3JpY2FsbHkgbWVhc3VyZWQgYXMgaGlnaCBhcyA5OCUsIHJlYWwgZXN0YXRlIG1hcmtldCBwcmljZXMgaW4gdGhlIFVTIGhpdCBuZWFyLXJlY29yZCBoZWlnaHRzIGZvbGxvd2luZyB0aGUgb3V0YnJlYWsgb2YgQ09WSUQtMTkgW0BBc2lhR3JlZW5dLiBBY2NvcmRpbmcgdG8gYSByZXBvcnQgcmVsZWFzZWQgYnkgWmlsbG93IEFuYWx5dGljcyBbQE1hbmhlcnR6XSwgVS5TLiByZWFsIGVzdGF0ZSBnYWluZWQgMi41IHRyaWxsaW9uIGRvbGxhcnMgb2YgdmFsdWUgaW4gMjAyMCBhbG9uZSwgcmVwcmVzZW50aW5nIHRoZSBsYXJnZXN0IHNpbmdsZS15ZWFyIGdyb3d0aCBzaW5jZSAyMDA1LCBkZXNwaXRlIGFuIGFwcHJveGltYXRlbHkgNzYwIGJpbGxpb24gZG9sbGFyIGRlY3JlYXNlIGluIEdEUCBpbiB0aGUgc2FtZSB5ZWFyIFtARlJFRDIwMjFdLiBUaGUgZm9jdXMgb2YgdGhpcyB0aGVzaXMgaXMgdG8gaW52ZXN0aWdhdGUgdGhlIHJlYXNvbnMgYmVoaW5kIHdoeSBhbmQgaG93IHJlYWwgZXN0YXRlIG1hcmtldCBwcmljZXMgaGF2ZSBicm9rZW4gdHJlbmQgYW5kIGJlaGF2ZWQgc28gdW5jaGFyYWN0ZXJpc3RpY2FsbHkgY291bnRlciBjeWNsaWNhbCBpbiB0aGUgZmFjZSBvZiBhIGdsb2JhbCBwYW5kZW1pYy4KCjxicj4KCioqKkZpZ3VyZSAxKioqCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L0dEUF9Ib3VzaW5nX05vbWluYWwucG5nKXt3aWR0aD03MCV9CjwvY2VudGVyPgoKPGJyPgoKSW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucywgSSB3aWxsIGFwcGx5IHRoZSBIZWRvbmljIFByaWNpbmcgTWV0aG9kIChIUE0pIHRvIExvdWlzaWFuYSBob3VzaW5nIG1hcmtldCBkYXRhIGluIG9yZGVyIHRvIGluZmVyZW50aWFsbHkgZGVzY3JpYmUgdGhlIGVjb25vbWljIGltcGFjdCBvZiB0aGUgZ2xvYmFsIHBhbmRlbWljIG9uIHJlc2lkZW50aWFsIGhvdXNpbmcgbWFya2V0IHZhbHVlcy4gRnVydGhlcm1vcmUsIEkgd2lsbCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgSFBNJ3Mgc3RydWN0dXJhbCBmcmFtZXdvcmsgb2YgdXNpbmcgcmVhbCBlc3RhdGUgcHJvcGVydGllcycgaGVkb25pYyBmZWF0dXJlcyAoZS5nLiwgc2l6ZSwgYWdlLCBudW1iZXIgb2YgYmVkcm9vbXMsIGV0Yy4pIHRvIHRlc3QgZm9yIGNoYW5nZXMgaW4gZGVtYW5kIGZvciBzcGVjaWZpYyBwcm9wZXJ0eSBmZWF0dXJlcyBwcmUgdnMgcG9zdCBwYW5kZW1pYy4gVGhlIEhQTSB3aWxsIGJlIGVjb25vbWV0cmljYWxseSBtb2RlbGVkIHVzaW5nIGFuIE9yZGluYXJ5IExlYXN0IFNxdWFyZXMgKE9MUykgcmVncmVzc2lvbnMgZnJhbWV3b3JrIGZvciBzcGVjaWZpYyB2YXJpYWJsZSBhbmFseXNpcyB3aGlsZSBzZXZlcmFsIHZhcmlhdGlvbnMgb2YgbWFjaGluZSBsZWFybmluZyAoTUwpIHByZWRpY3Rpb24gbW9kZWxzIHdpbGwgYmUgZXN0aW1hdGVkIHRvIHRlc3QgZGlmZmVyZW50IGluZGVwZW5kZW50IHZhcmlhYmxlcycgbWF4aW11bSBleHBsYW5hdG9yeSBwb3dlciBpbiBwcmVkaWN0aW5nIG91dC1vZi1zYW1wbGUgb2JzZXJ2YXRpb25zLiBUaGUgcmVzdWx0cyBvZiB0aGVzZSBtb2RlbHMgd2lsbCBzaGVkIGxpZ2h0IGludG8gdGhlIG90aGVyd2lzZSBjb3VudGVyIGludHVpdGl2ZSByZXNwb25zZSBvZiByZWFsIGVzdGF0ZSBwcmljaW5nIGR5bmFtaWNzIHRvIHRoZSBDT1ZJRC0xOSBnbG9iYWwgcGFuZGVtaWMuICAgIAoKPGJyPjxicj4KCiMjIyAyLiBMaXRlcmF0dXJlIFJldmlldwoKIyMjIyAyLjEgQmFja2dyb3VuZAoKVGhlIG1hcmtldCB2YWx1ZSBvZiBhIGNvbW1vZGl0eSBpcyBtb3N0IG9mdGVuIHRoZW9yZXRpY2FsbHkgZGVmaW5lZCBhcyB0aGUgZXF1aWxpYnJpdW0gcHJpY2UgZGVyaXZlZCBmcm9tIHRoZSBiYXNpYyBlY29ub21pYyBwcmluY2lwYWwsIG9yIGxhdywgb2Ygc3VwcGx5IGFuZCBkZW1hbmQgW0BMb2NrZTsgQEVwcGxlXS4gSG93ZXZlciwgdGhlIHJlYWwgZXN0YXRlIG1hcmtldCBvZnRlbiB2aW9sYXRlcyB0aGlzIGFzc3VtcHRpb24gZHVlIHRvIGl0cyB1bmlxdWUgY2hhcmFjdGVyaXN0aWNzIGFzIGFuIGFzc2V0IGNsYXNzIFtAV2hlYXRvbl0uIEZvciBleGFtcGxlLCBtdWNoIG9mIHRoZSB1bmRlcmx5aW5nIHV0aWxpdHkgb2YgYSBwcm9wZXJ0eSBpcyBpdHMgdXNlIGFzIGEgbWVhbnMgb2Ygc2hlbHRlciBieSBpdHMgb3duZXIgW0BMaW5nXS4gVGhpcyByYXRoZXIgdW51c3VhbCByZWxhdGlvbnNoaXAgdG8gdGhpcyBhc3NldCBpbnRyb2R1Y2VzIHNldmVyYWwgYmVoYXZpb3JhbCBiaWFzZXMgd2hpY2ggY2F1c2UgZWNvbm9taWMgZnJpY3Rpb25zIG5vdCBhY2NvdW50ZWQgZm9yIGJ5IHRyYWRpdGlvbmFsIG5lb2NsYXNzaWNhbCBlY29ub21pYyB0aGVvcnkgW0BOaWNvbGFpZGVzXS4gQSBub3RhYmxlIGV4YW1wbGUgb2YgYmVoYXZpb3JhbCBiaWFzIGltcGFjdGluZyByZWFsIGVzdGF0ZSBwcmljZSBkeW5hbWljcyBpcyB0aGUgZW5kb3dtZW50IGVmZmVjdC4gVGhpcyBiZWhhdmlvcmFsIGZpbmRpbmcgd2FzIG9yaWdpbmFsbHkgZXN0YWJsaXNoZWQgYnkgQEthaG5lbWFuIGluIHRoZSBsYXRlIDIwdGggY2VudHVyeSwgYW5kIGxhdGVyIGFwcGxpZWQgdG8gcmVhbCBlc3RhdGUgbWFya2V0cyBieSBAQkFPLiBUaGUgbGF0dGVyIG9mIHRoZSB0d28gc3RhdGluZyB0aGF0IHRoZSBwcmVkaWN0YWJseSBpcnJhdGlvbmFsIGJlaGF2aW9yIG9mIG1hcmtldCBwYXJ0aWNpcGFudHMgdG8gb3ZlcnZhbHVlIHRoZWlyIGhvbWUgZHVlIHRvIHNlbnRpbWVudGFsIGF0dGFjaG1lbnQgdG8gdGhlIHByb3BlcnR5IGZvcmNlcyBtYXJrZXQgcHJpY2VzIGludG8gc3VzdGFpbmVkIGVjb25vbWljIGRpc2VxdWlsaWJyaXVtLiBPdGhlciBoaWdobHkgY2l0ZWQgYW5kIHVudXN1YWwgY2hhcmFjdGVyaXN0aWNzIGFyZSB0aGF0IHJlYWwgZXN0YXRlIGFzc2V0cyBhcmUgdmVyeSBpbmZyZXF1ZW50bHkgdHJhZGVkIGR1ZSB0byBoaWdoIHRyYW5zYWN0aW9uIGNvc3RzIFtAQ29sbGV0dDsgQEd1aWxrZXldLCBnb3Zlcm5tZW50cyB0ZW5kIHRvIGludGVyZmVyZSwgYm90aCBkaXJlY3RseSBhbmQgaW5kaXJlY3RseSB3aXRoIHJlYWwgZXN0YXRlIG1hcmtldHMgdGhyb3VnaCB0aGUgY3JlYXRpb24gb2YgZmlzY2FsIGFuZCBtb25ldGFyeSBwb2xpY2llcyBbQEJpbmd5YW5nOyBARHVdLCBhbmQgdGhyb3VnaCBjcmVhdGluZyByZW50ZXItcHJvdGVjdGlvbnMgbGF3cyBzdWNoIGFzICdzcXVhdHRlcidzIHJpZ2h0cycgbGF3cyB3aGljaCBhbGxvdyBhIHJlbnRlciB0byByZW1haW4gaW4gYSBob21lIGZvciBleHRlbmRlZCBwZXJpb2RzIG9mIHRpbWUgbG9uZyBhZnRlciB0aGV5IGhhdmUgc3RvcHBlZCBwYXlpbmcgcmVudCBbQEhveTsgQEdhcmRpbmVyXS4KCiMjIyMgMi4yIFJlYWwgRXN0YXRlIFZhbHVhdGlvbiBNZXRob2RzCgpUaGUgaWRpb3N5bmNyYXRpYyBhc3NldCBmZWF0dXJlcyBvdXRsaW5lZCBpbiBzZWN0aW9uIDIuMSBhbG9uZyB3aXRoIGEgaGlnaCBsZXZlbCBvZiBoZXRlcm9nZW5laXR5IGFjcm9zcyBtYW55IGRpbWVuc2lvbnMgb2YgdGhlIGVudGlyZSByZWFsIGVzdGF0ZSBhc3NldCBjbGFzcyBtYWtlcyB0aGUgY3JlYXRpb24gb2YgYSBnZW5lcmFsaXplZCBwcmljaW5nIG1vZGVsIGRpZmZpY3VsdCBhbmQgaGF2ZSBsZWQgdG8gYSB3aWRlIHJhbmdlIG9mIHByb3Bvc2FscyBhbmQgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoYXQgZGV0ZXJtaW5lcyB0aGUgbWFya2V0IHByaWNlIG9mIHJlYWwgZXN0YXRlIGFzc2V0cyBhbmQgaG93IHRvIHJlbGlhYmx5IG1vZGVsIHRob3NlIHByaWNpbmcgZHluYW1pY3MgW0BDdXJjdXJ1XS4gSW4gQFBhZ291cnR6aSwgdGhlIGF1dGhvcnMgb3V0bGluZXMgc2V2ZXJhbCBvZiB0aGUgY3VycmVudGx5IGFjY2VwdGVkIHJlYWwgZXN0YXRlIHZhbHVhdGlvbiBtZXRob2RzLCByYW5naW5nIGZyb20gd2hhdCB0aGV5IGNhdGVnb3JpemUgYXMgdGhlICp0cmFkaXRpb25hbCBtZXRob2RzKiwgc3VjaCBhcyBjb21wYXJhYmxlLWdyb3VwLCBjb3N0LCBpbmNvbWUtbXVsdGlwbGUsIHByb2ZpdC1tdWx0aXBsZSwgYW5kIGNvbnRyYWN0b3LigJlzIG1ldGhvZCwgdG8gdGhlICphZHZhbmNlZCBtZXRob2RzKiwgc3VjaCBhcyBBTk5zLCBzcGF0aWFsIGFuYWx5c2lzIG1ldGhvZHMsIGZ1enp5IGxvZ2ljLCBhbmQgdGhlIGhlZG9uaWMgcHJpY2luZyBtZXRob2QuIEFjY29yZGluZyB0byBhIG1ldGEgYW5hbHlzaXMgY29uZHVjdGVkIGJ5IEBTaXJtYW5zLCBjdXJyZW50bHksIHRoZSBtb3N0IHdpZGVseSB1c2VkIGFuZCBhY2NlcHRlZCBhZHZhbmNlZCBtZXRob2RvbG9naWNhbCBmcmFtZXdvcmsgZm9yIHJlYWwgZXN0YXRlIHZhbHVhdGlvbiBtb2RlbGluZyBpcyB0aGUgSGVkb25pYyBQcmljaW5nIE1ldGhvZC4KCgojIyMjIyAyLjIuMSBIZWRvbmljIFByY2luZyBNb2RlbCBpbiBSZWFsIEVzdGF0ZQoKRmlyc3QgYXBwbGllZCBpbiAxOTM5IG9uIGF1dG9tb2JpbGUgZGF0YSwgYWNjb3JkaW5nIHRvIEBHb29kbWFuLCB0aGUgSFBNIGlzIGEgbW9kZWwgd2hpY2ggZXN0aW1hdGVzIHRoZSB2YWx1ZSBvZiBkaXN0aW5jdCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjb21tb2RpdHkgd2hpY2ggZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjb250cmlidXRlIHRvIGl0cyBtYXJrZXQgdmFsdWUuIEJlc2lkZXMgaXRzIGltcGxlbWVudGF0aW9uIGluIHJlYWwgZXN0YXRlIGZpbmFuY2UgYW5kIGVjb25vbWljcywgc3VjaCBhcyBpbiB0aGlzIHRoZXNpcywgdGhpcyBtZXRob2RvbG9neSBoYXMgYSB3aWRlIHJhbmdlIG9mIGFwcGxpY2F0aW9ucyBzdWNoIGFzIGl0cyBpbXBsZW1lbnRhdGlvbiBpbiBjb25zdW1lciBhbmQgbWFya2V0IHJlc2VhcmNoIFtASG9sYnJvb2s7IEBBcm5vbGRdLCBjb25zdHJ1Y3Rpb24gb2YgY29uc3VtZXIgcHJpY2UgaW5kaWNlcyBbQE1vdWx0b247IEBTY2h1bHR6ZV0sIHZhcmlvdXMgdGF4IGFzc2Vzc21lbnRzIFtAQmVycnk7IEBCZXJuYXNjb25pXSwgYXV0b21hdGVkIGF1dG9tb2JpbGUgdmFsdWF0aW9uIFtAQ3Jvd2xpbmc7IEBNYXRhc10sIGFuZCBjb21wdXRlciBzYWxlcyBbQER1bGJlcmdlcjsgQFdha2VmaWVsZF0uCgpTaW5jZSBpdHMgaW50cm9kdWN0aW9uLCB0aGUgSFBNIGhhcyBnYWluIHNpZ25pZmljYW50IHBvcHVsYXJpdHkgYW1vbmcgaG91c2luZyBtYXJrZXQgYW5kIGNvbW1lcmNpYWwgcmVhbCBlc3RhdGUgcmVzZWFyY2hlcnMuIFRoZSBzcGVjaWZpYyByZWFsIGVzdGF0ZS1iYXNlZCB0b3BpY3MgaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgdGhlIGNvbnN0cnVjdGlvbiBvZiBob3VzaW5nIHByaWNlIGluZGljZXMgW0BHb3VyaWVyb3V4OyBAV2FsbGFjZV0sIHRoZSBlc3RpbWF0aW9uIGFuZCBwcmVkaWN0aW9uIG9mIGEgcHJvcGVydHkncyBtYXJrZXQgdmFsdWUgaW4gc2l0dWF0aW9ucyB3aGVyZSBtYXJrZXQtdHJhbnNhY3Rpb24gZGF0YSBpcyBsb3ctZGltZW5zaW9uYWwgb3Igbm9uLWV4aXN0ZW50IFtATGVTYWdlXSwgYW5kLCBhcyBpbiB0aGlzIHRoZXNpcywgdGhlIHNwZWNpZmljIGFuYWx5c2lzIG9mIGNoYW5nZXMgaW4gdGhlIGRlbWFuZCBmb3Igc3BlY2lmaWMgcHJvcGVydHkgY2hhcmFjdGVyaXN0aWNzIGFjcm9zcyB0aW1lLCBzdWJncm91cHMsIG9yIGJvdGggW0BDbGFwcF0uIEFzIHRoZSBicm9hZCBzZWFyY2ggZm9yIGEgc2F0aXNmYWN0b3J5IG1vZGVsaW5nIGZyYW1ld29yayBmb2N1c2VzIGluIG9uIHRoZSBIUE0sIGFub3RoZXIgZGViYXRlIGFyaXNlcyByZWdhcmRpbmcgdGhlIGJlc3QgZnVuY3Rpb25hbCBmb3JtIG9mIHRoaXMgbWV0aG9kLiBUcmFkaXRpb25hbGx5IHV0aWxpemluZyB0aGUgc3RhbmRhcmQgT0xTIGZyYW1ld29yayBbQFBhY2VdLCByZXNlYXJjaGVycyBhcmUgaW5jcmVhc2luZ2x5IHV0aWxpemluZyBhIHZhcmlldHkgbWFjaGluZSBsZWFybmluZyBhbGdvcml0aG1zIHRvIGFjY29tcGxpc2ggYW4gaW5jcmVhc2luZ2x5IG1vcmUgcmVmaW5lZCBzZXQgb2YgZmluZGluZ3MuCgojIyMjIyAyLjIuMiBPTFMgYW5kIHRoZSBIZWRvbmljIFByaWNpbmcgTW9kZWwgaW4gUmVhbCBFc3RhdGUKVW5zdXJwcmlzaW5nbHksIHJlZ3Jlc3Npb24gYW5hbHlzaXMgaXMgdGhlIHByZWZlcnJlZCBlc3RpbWF0aW9uIGFwcHJvYWNoIGFtb25nIHJlYWwgZXN0YXRlIHJlc2VhcmNoZXJzIHdoZW4gdXNpbmcgSFBUIGZvciBwcmljZSBlc3RpbWF0aW9uLiBUaGVzZSBtdWx0aXBsZSByZWdyZXNzaW9uIGFuYWx5c2lzIG1ldGhvZHMgYXJlIG1vc3Qgb2Z0ZW4gZWl0aGVyIGFuIE9yZGluYXJ5IExlYXN0IFNxdWFyZXMgKE9MUykgcmVncmVzc2lvbiBvciBhIE1heGltdW0gTGlrZWxpaG9vZCBhcHByb3hpbWF0aW9uIG9mIHRoZSBsb2ctbGlrZWx5IGVxdWF0aW9uIGRlcml2ZWQgZGlyZWN0bHkgZnJvbSB0aGUgaGVkb25pYyBmdW5jdGlvbi4gRWFjaCBvZiB0aGVzZSBlc3RpbWF0aW9uIG1ldGhvZHMgdGFrZSBhIGZ1bmN0aW9uYWxseSBzaW1pbGFyIHBhdGggYXMgdGhleSBib3RoIGVzdGltYXRlIGEgdmVjdG9yIG9mIHBhcmFtZXRlcnMgKGkuZS4gYmV0YSBjb2VmZmljaWVudHMpIHRoYXQgYmVzdCBmaXRzIHRoZSBleHBsYW5hdG9yeSBoZWRvbmljIHZhcmlhYmxlcyB0byB0aGUgYXNzb2NpYXRlZCBtYXJrZXQgcHJpY2UuIFRoZXkgZGlmZmVyIG9ubHkgYnkgdGhlIGxvc3MgZnVuY3Rpb24gdXNlZCBpbiB0aGUgaWRlbnRpZmljYXRpb24gb2YgdGhhdCBiZXN0LWZpdHRlZCBwYXJhbWV0ZXIgdmVjdG9yLgoKVGhlIG1vc3QgY29tbW9ubHkgdXNlZCBoZWRvbmljIHByaWNlIHJlZ3Jlc3Npb24gZXF1YXRpb24gd2l0aCByZXNwZWN0IHRvIHJlYWwgZXN0YXRlIG1hcmtldHMgbW9kZWxzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtYXJrZXQgcmVudHMgb3IgbWFya2V0IHByb3BlcnR5IHZhbHVlcyB0byBhIGxpc3Qgb2YgaGVkb25pYyBjaGFyYWN0ZXJpc3RpY3MuIFRoZSBjbGFzc2ljYWwgY29uc3RydWN0aW9uIG9mIHRoaXMgbW9kZWwgYWNjb3JkaW5nIHRvICoqKEhlcmF0aCwgUy4gSy4gJiBNYWllciwgRy4gKDIwMTApKSoqIGlzIHRoZSBmb2xsb3dpbmc6CgokJApSID0gZihQLE4sTCx0KQokJAp3aGVyZSAkUiQgaXMgcmVudCBvciBwcmljZSBvZiB0aGUgcHJvcGVydHk7ICRQJCBpcyBwcm9wZXJ0eSByZWxhdGVkIGF0dHJpYnV0ZXM7ICROJCBpcyBuZWlnaGJvcmhvb2QgY2hhcmFjdGVyaXN0aWNzOyAkTCQgaXMgbG9jYXRpb25hbCB2YXJpYWJsZXMgYW5kOyAkdCQgaXMgYW4gaW5kaWNhdG9yIG9mIHRpbWUuCgojIyMjIyAyLjIuMyBNYWNoaW5lIExlYXJuaW5nIGFuZCB0aGUgSGVkb25pYyBQcmljaW5nIE1vZGVsIGluIFJlYWwgRXN0YXRlCgpUaG91Z2ggZmlyc3QgaW50cm9kdWNlZCBieSBAVHVyaW5nIHVuZGVyIHRoZSBicm9hZGVyIHVtYnJlbGxhIHRlcm0gb2YgKmFydGlmaWNpYWwgaW50ZWxsaWdlbmNlKiwgdGhlIGFkb3B0aW9uIG9mIE1MIG1ldGhvZHMgaW4gcmVhbCBlc3RhdGUgd291bGQgdGFrZSBtYW55IHllYXJzIG9mIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSBkZXZlbG9wbWVudCwgYWxsb3dpbmcgb3IgdGhlIHN1YnNlcXVlbnQgY29sbGVjdGlvbiBvZiBldmVyLWdyb3dpbmcgZGF0YSBzZXRzIGFuZCBjZW50cmFsIHByb2Nlc3NpbmcgdW5pdGVzIChDUFVzKSBjYXBhYmxlIG9mIHByb2Nlc3NpbmcgdGhlIG9mdGVuIGV4dHJhb3JkaW5hcnkgbnVtYmVyIG9mIGNhbGN1bGF0aW9uIHJlcXVpcmVkIHRvIHByb2R1Y2UgYSBzb2x1dGlvbiBmb3IgYSBnaXZlbiBhbGdvcml0aG0gW0BEdXR0YV0uIFRoZSBwcmltYXJ5IGFkdmFudGFnZSBvZiBNTCB0ZWNobmlxdWVzIGFyZSB0aGF0IE1MIGFsZ29yaXRobXMgbGVhcm4gYW5kIGltcHJvdmUgb3ZlciB0aW1lIGFuZCBhY3Jvc3MgbWFueSBpdGVyYXRpb25zIGFuZCB2YXJpYWJsZSBjb21iaW5hdGlvbnMsIHdoaWxlIHRyYWRpdGlvbiBzdGF0aXN0aWNhbCBhbmQgZWNvbm9tZXRyaWMgdGVjaG5pcXVlcyBwcm9kdWNlIHN0YXRpYyByZXN1bHRzIGFjcm9zcyBhIHNpbmdsZSBtb2RlbCBbQEFuZ3VpdGFdLiBUaGUgYWxnb3JpdGhtIGltcHJvdmVzIGFjcm9zcyB0aG9zZSBpdGVyYXRpb25zIGFzIGl0IHNlZWtzIHRvIG1pbmltaXplIHRoZSBtb2RlbCdzIGVycm9yIGluIHByZWRpY3Rpbmcgb2JzZXJ2YXRpb25zIG5vdCBwcmV2aW91c2x5IHNlZW4sIG9mdGVuIGNhbGxlZCAqb3V0IG9mIHNhbXBsZSogb2JzZXJ2YXRpb25zLiBCeSBkb2luZyB0aGlzLCB0aGUgYWxnb3JpdGhtIHNlZWtzIHRvIGZpbmQgdGhlIHN0cm9uZ2VzdCBnZW5lcmFsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgaW5zdGVhZCBvZiBzZWVraW5nIHRvIG1pbmltaXplIHRoZSBlcnJvciB3aXRoaW4gYSBnaXZlbiBzYW1wbGUgc2V0LiBUaGlzIGluIHRlcm4gcmVzdWx0cyBpbiBzdHJvbmdlciwgbW9yZSBnZW5lcmFsaXplZCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZmluZGluZ3MuICAgIAogCkBNb2hkIHByb3ZpZGVzIGEgdGhvcm91Z2ggb3ZlcnZpZXcgb2YgdGhlIHZhcmlvdXMgYXBwbGljYXRpb25zIG9mIE1MIHRvIHJlYWwgZXN0YXRlIHZhbHVhdGlvbiBtZXRob2RzLCBpbmNsdWRpbmcgdGhlIFJpZGdlLCBMYXNzbyByZWdyZXNzaW9uIHRlY2huaXF1ZXMgYXMgd2VsbCBhcyBhcnRpZmljaWFsIG5ldXJhbCBuZXR3b3JrcyAoQU5OKSBhbmQgZ3JhZGllbnQgYm9vc3RpbmcgdGVjaG5pcXVlcyB1c2VkIGluIHRoaXMgdGhlc2lzLiBUaGUgYXV0aG9yIGNvbmNsdWRlcyB0aGF0IE1MIG1vZGVscyBvdXQgcGVyZm9ybSBvdGhlciBzdGFuZGFyZCB2YWx1YXRpb24gbWV0aG9kcyBzdWNoIGFzIG11bHRpcGxlcyBhbmQgT0xTIHZhbHVhdGlvbiBtZXRob2RzIGluIGJvdGggYWNjdXJhY3kgYW5kIHN0cmVuZ3RoIG9mIGludGVycHJldGF0aW9uLiBUaGUgYmVzdCBwZXJmb3JtaW5nIG9mIHRoZXNlIG1vZGVscyB3YXMgYSBncmFkaWVudCBib29zdGluZyBtb2RlbCwgd2hpY2ggd2FzIGFibGUgdG8gY2FwdHVyZSB0aGUgb2Z0ZW4gaGlkZGVuIGxheWVycyBvZiBpbnRlcmFjdGlvbiBiZXR3ZWVuIGhlZG9uaWMgZmVhdHVyZXMuCgo8YnI+CgojIyMjIDIuMyBDT1ZJRC0xOSBDcmlzaXMnIEltcGFjdCBvbiBSZWFsIEVzdGF0ZSBNYXJrZXRzCgpJbiB0aGUgd2FrZSBvZiB0aGUgQ09WSUQtMTkgY3Jpc2lzLCB0aGVyZSB3ZXJlIHNldmVyYWwgcGFwZXJzIGFuZCBhcnRpY2xlcyByZWdhcmRpbmcgdGhlIGVjb25vbWljIGltcGFjdCBvZiB0aGUgZ2xvYmFsIHBhbmRlbWljIG9uIHRoZSBob3VzaW5nIG1hcmtldCBiZWluZyBleHBlZGl0aW91c2x5IHB1Ymxpc2hlcyBpbiB2aXJ0dWFsbHkgZXZlcnkgbWFqb3Igam91cm5hbC4gVGhlc2UgcGFwZXJzIGludmVzdGlnYXRlIHRvcGljcyBzdWNoIGFzIHN0cnVjdHVyYWwgYW5kIHRlbXBvcmFsIGNoYW5nZXMgaW4gdGhlIGhvdXNpbmcgbWFya2V0IHVzaW5nIGhlZG9uaWMgbWV0aG9kcyBbQFNoaW1penVdLCBjaGFuZ2VzIGluIGhvdXNpbmcgbWFya2V0IGRlbWFuZCBmb3Igc3BlY2lmaWMgcHJvcGVydHkgdHlwZXMgYW5kIGZlYXR1cmVzIFtAVGFqYW5pXSwgcG90ZW50aWFsIGNoYW5nZXMgaW4gaG91c2luZyBwcmVmZXJlbmNlcyBkdWUgdG8gdGhlIENPVklELTE5IHBhbmRlbWljIGFuZCBoaWdobGlnaHQgdGhlIGNoYWxsZW5nZXMgZm9yIHBvbGljeSBtYWtpbmcgW0BOYW5kYV0uIEVhY2ggb2YgdGhlc2UgcGFwZXJzIHJlc3VsdCBpbiBmaW5kaW5ncyB3aGljaCBlc3RhYmxpc2ggYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGltcGFjdCBvZiBDT1ZJRC0xOSBvbiByZWxhdGl2ZSBkZW1hbmQgZm9yIGNlcnRhaW4gaGVkb25pYyBmZWF0dXJlcyBpbiBlYWNoIHJlc3BlY3RpdmUgcmVhbCBlc3RhdGUgbWFya2V0LiBMYXRlciBpbiB0aGlzIHRoZXNpcywgSSB3aWxsIGVzdGFibGlzaCBhIHNpbWlsYXIgZmluZGluZyBpbiB0aGUgTG91aXNpYW5hIGhvdXNpbmcgbWFya2V0LgoKPGJyPjxicj4KCiMjIyAzLiBEYXRhIAojIyMjIDMuMSBEYXRhIENvbGxlY3Rpb24KClRoZSB1dGlsaXphdGlvbiBvZiBCaWcgRGF0YSBjb2xsZWN0ZWQgdGhyb3VnaCBhIGRhdGEtbWluaW5nIHByb2Nlc3MgY2FsbGVkICp3ZWItc2NyYXBwaW5nKiBoYXMgaW5jcmVhc2luZ2x5IGJlY29tZSB0aGUgbWV0aG9kIG9mIGNob2ljZSBmb3IgcmVzZWFyY2hlcnMgYWNyb3NzIGRpc2NpcGxpbmVzLiBUaGUgdGVybSB3ZWItc2NyYXBwaW5nIHNpbXBseSByZWZlcnMgdG8gdGhlIHByb2Nlc3Mgb2YgY29sbGVjdGluZyBzdHJ1Y3R1cmVkIGRhdGEgZnJvbSB3ZWJzaXRlcyB1c2luZyBhbGdvcml0aG1zIHRvIGF1dG9tYXRlIHRoZSBjb2xsZWN0aW9uIHByb2Nlc3MuIE1ldGhvZHMgc2ltaWxhciB0byBvbmVzIEkgaGF2ZSBpbXBsZW1lbnRlZCBpbiB0aGlzIHRoZXNpcyBoYXZlIGJlZW4gdXNlZCBieSBlc3RhYmxpc2hlZCBhdXRob3JzIHN1Y2ggYXMgKipCb3JkZSBldCBhbC4sIFDDqXJlei1SYXZlIGV0IGFsLiBhbmQgQmVyYXdpIGV0IGFsLioqIAoKSW4gdGhpcyB0aGVzaXMsIEkgaGF2ZSB1c2VkIGEgbWl4dHVyZSBvZiB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIFIgYW5kIFB5dGhvbiwgc3VwcGxlbWVudGVkIGJ5IHNldmVyYWwgcGFja2FnZXMgY3JlYXRlZCBieSBTZWxlbml1bSwgdG8gd3JpdGUgYW4gYWxnb3JpdGhtIHRoYXQgY29sbGVjdHMgdGhlIHJlcXVpcmVkIGhlZG9uaWMgdmFyaWFibGVzIGZvciB0aGlzIHJlc2VhcmNoIGZyb20gdGhlIE11bHRpcGxlIExpc3RpbmcgU2VydmljZXMgKE1MUykuICoqVGFibGUgMSoqIGlzIGEgc3VtbWFyeSBvZiB0aGUgb3JpZ2luYWwgZGF0YSBzZXQncyBrZXkgZmVhdHVyZXMuCgojIyMjIDMuMiBEYXRhIFByb2Nlc3NpbmcKClRob3VnaCB0aGUgZGF0YS1jb2xsZWN0aW5nIGFsZ29yaXRobXMgcmV0dXJuIHN0cnVjdHVyZWQgZGF0YSwgaXQgaXMgbmV2ZXJ0aGVsZXNzIGZhciBmcm9tIGJlaW5nIHN1aXRhYmxlIGZvciB0aGUgcmF0aGVyIHBpY2t5Cm1vZGVscyB3aGljaCB3aWxsIGV2ZW50dWFsbHkgYW5hbHl6ZSB0aGVtLiBUaGVyZWZvcmUsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2VzIHdlcmUgY29tcGxldGVkIGluIG9yZGVyIHRvIHJlbmRlciB0aGUgcmF3IGRhdGEKaW50byBhIHVzYWJsZSBmb3JtOgoKMS4gKipNaXNzaW5nIHZhbHVlcyoqIChpLmUuIE4vQSB2YWx1ZXMpIHdlcmUgcmVtb3ZlZCAKMi4gKipPdXRsaWVycyoqIHdlcmUgaWRlbnRpZmllZCBhbmQgcmVtb3ZlZCBmb3IgYWxsIGNvbnRpbnVvdXMgdmFyaWFibGVzCiAgICsgQW4gJ291dGxpZXInIGlzIGRlZmluZWQgYnkgYmVpbmcgbW9yZSB0aGFuIDEuNSBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4gb2YgdGhlIHZhcmlhYmxlJ3Mgb3duIGRpc3RyaWJ1dGlvbgozLiAqKk11bHRpbGV2ZWwgZmFjdG9yKiogZGF0YSB3YXMgYnJva2VuIG91dCBieSBlYWNoIGxldmVsIGludG8gYmluYXJ5IHJlcHJlc2VudGF0aW9ucyB0aHJvdWdoICpIb3QtT25lKiBjb2RpbmcKICAgKyBTb21lIGZlYXR1cmVzIHdoaWNoIGhhZCBhIGxhcmdlIG51bWJlciBvZiBmYWN0b3IgbGV2ZWxzIHdlcmUgc2ltcGxpZmllZCB1c2luZyBMYXNzbyByZWdyZXNzaXZlIG1ldGhvZHMKNC4gKipIaWdoLWxldmVyYWdlKiogcG9pbnQgb2JzZXJ2YXRpb25zLCBhY2NvcmRpbmcgdG8gZGlhZ25vc3RpYyBsaW5lYXIgcmVncmVzc2lvbiwgd2VyZSByZW1vdmVkCjUuICoqRHVwbGljYXRlcyoqLCBkZWZpbmVkIGJ5IHRoZSBNTFMgdW5pcXVlIGlkZW50aWZpY2F0aW9uIG51bWJlciwgd2VyZSByZW1vdmVkCjYuICoqU3RydWN0dXJhbCBlcnJvcnMqKiAoZS5nLiBkYXRlcyBzdHJ1Y3R1cmVkIGFzIHN0cmluZyB2YXJpYWJsZSkgd2VyZSBjb3JyZWN0ZWQKNy4gKipCaW5hcnkgdmFyaWFibGVzKiogd2VyZSBjcmVhdGVkIGZvciBrZXkgdmFyaWFibGVzIChlLmcuIGNpdHlfbGltaXRzKSBieSB0aGUgZm9sbG93aW5nIHN0YW5kYXJkIG1ldGhvZDoKCiQkCklcbGVmdCh5XHJpZ2h0KT1cbGVmdFx7XGJlZ2lue2FycmF5fXtsbH0xLFxxdWFkIHhcaW4gQVxcMCwgXHF1YWQgeCBcbm90aW4gQVxlbmR7YXJyYXl9XHJpZ2h0LiwKJCQKV2hlcmUgJEkkIGlzIGFuIGluZGljYXRvciBmdW5jdGlvbiB3aXRoIHNwYWNlICRBJCB0aGF0IGNvbXBvc2VzIGR1bW15IHZhcmlhYmxlICR4JCBpbnRvICQxJCBpZiB0aGUgY29uZGl0aW9uIGlzIG1ldCBhbmQgaW50byAkMCQgaWYgaXQgaXMgbm90LgoKPGJyPgoKKioqVGFibGUgMSoqKgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9EYXRhIENvbGxlY3Rpb2luL0RhdGFfdGFibGVfMS5wbmcpe3dpZHRoPTQwJX0KPC9jZW50ZXI+Cgo8YnI+CgpUaGUgcmVzdWx0cyBvZiB0aGUgZGF0YSBjbGVhbmluZyBwcm9jZXNzZXMgY2FuZSBiZSBzZWVuIGluICoqdGFibGUgMioqLgoKPGJyPgoKKioqVGFibGUgMioqKgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9EYXRhIENvbGxlY3Rpb2luL0RhdGFfdGFibGVfMi5wbmcpe3dpZHRoPTYwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIDMuMyBWYXJpYWJsZSBMaXN0CkEgbGlzdCBhbmQgc2hvcnQgZGlzY3JpcHRpb24gb2YgYWxsIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgdGhlc2lzIGNhbiBiZSBmb3VuZCBpbiAqKipUYWJsZSAzKioqCgo8YnI+CgoqKipUYWJsZSAzKioqCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L0RhdGEgQ29sbGVjdGlvaW4vVmFyX2xpc3RfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgoKPGJyPjxicj4KCiMjIyMgMy4zIERhdGEgRGlzdHJpcHRpdmUgU3RhdGlzdGljcwojIyMjIyAzLjMuMSBDb3JyZWxhdGlvbiAKVGhlIGNvcnJlbGF0aW9uIG1hdHJpeCAoc2VlICoqKkltYWdlIDIqKiopIGJldHdlZW4gYWxsIG51bWVyaWMgdmFyaWFibGVzIHNob3dzIHRoYXQgd2l0aCBleGNlcHRpb24gdG8gdGhlIHZhcmlhYmxlcyB3aGljaCB3aWxsIGhhdmUgb2J2aW91cyBjb3JyZWxhdGlvbnMgKGUuZy4gc29sZF9wcmljZSBhbmQgbGlzdF9wcmljZSwgYXJlYV90b3RhbCBhbmQgYXJlYV9saXZpbmcsIGFuZCBpbmZlY3Rpb25zIGZpZ3VyZXMpLCB0aGVyZSBhcmUgbm8gb3RoZXIgY29ycmVsYXRpb25zIHdoaWNoIHdvdWxkIGNhdXNlIGNvbmNlcm4uCgo8YnI+CgoqKipJbWFnZSAyKioqCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L2NvcnJlbGF0aW9uX21hdHJpeC5wbmcpe3dpZHRoPTgwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyAzLjMuMiBEaXN0cmlidXRpb25zIG9mIFNlbGVjdCBWYXJpYWJsZXMKQXMgdGhlIHN0YW5kYXJkIGRlc2NyaXB0aXZlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHBhcnRpY3VsYXIgdmFyaWFibGUgYXJlIGNvbnNpZGVyZWQgKGkuZS4gbWVhc3VyZXMgb2YgZnJlcXVlbmN5LCBjZW50cmFsIHRlbmRlbmN5LCBkaXNwZXJzaW9uLCBhbmQgcG9zaXRpb24pLCB0aGUgbWF0cml4IG9mIGRlbnNpdHkgcGxvdHMgYmVsb3cgKHNlZSAqKipJbWFnZSAzKioqKSBnaXZlIHVzIGEgZ29vZCBvdmVydmlldyBvZiB0aGUgbW9zdCByZWxldmFudCB2YXJpYWJsZXMgaW4gdGhpcyBkYXRhIHNldC4gCgo8YnI+CgoqKipJbWFnZSAzKioqCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1NlbGVjdF92YXJfc3VtbWFyeS5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKIyMjIyMgMy4zLjMgUHJpY2UgSW5kZXgKVG8gdW5kZXJzdGFuZCB0aGUgZ2VuZXJhbCBzaGFwZSBhbmQgaGlzdG9yaWNhbCB0cmVuZCBvZiB0aGUgcHJpY2luZyBtYXJrZXQgc3BlY2lmaWNhbGx5IHdpdGhpbiBMb3Vpc2lhbmEsIEkgaGF2ZSBjb25zdHJ1Y3RlZCBhIHNpbXBsZSB3ZWlnaHRlZC1hdmVyYWdlIHByaWNlIHBlciBzcWZ0LiBpbmRleCAoc2VlICoqKkltYWdlIDQqKiopIHVzaW5nIDEsIDIsIDMsIGFuZCA0IG1vbnRoLW1vdmluZyBhdmVyYWdlcyBvZiB0aGUgZW50aXJlIGRhdGEgc2V0LiBGdXJ0aGVybW9yZSwgSSBzaG93IHRoZSBTdC4gTG91aXMgRmVkZXJhbCBSZXNlcnZlJ3MgR0RQICgqZ3JlZW4qKSBhbmQgcHJpY2UgaW5kZXggKCpwdXJwbGUqKSBmb3IgdGhlIExvdWlzaWFuYSBob3VzaW5nIG1hcmtldCAoc2VlICoqKkltYWdlIDUqKiouIFRob3VnaCB0aGUgbWV0aG9kcyB1c2VkIGluIGJvdGggaW5kZWNpZXMgYXJlIG5vdCB0aGUgc2FtZSwgd2hpY2ggYWNjb3VudHMgZm9yIHRoZSBnZW5lcmFsIGxldmVsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3bywgb25lIGNhbiBzZWUgdGhlIHNoYXBlIG9mIHRoZSBkYXRhIGlzIGZpdHRpbmcgdG8gdGhlIHBvcHVsYXRpb24uICAgCgo8YnI+CgoqKipJbWFnZSA0KioqCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L2luZGV4X2xhLnBuZyl7d2lkdGg9OTAlfQo8L2NlbnRlcj4KCjxicj4KPGJyPgoKKioqSW1hZ2UgNSoqKgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9nZHBfbGEucG5nKXt3aWR0aD05MCV9CjwvY2VudGVyPgoKPGJyPjxicj4KCiMjIyA0LiBNZXRob2RvbG9neQpUaGUgb3ZlcmFyY2hpbmcgbWV0aG9kIHVzZWQgaW4gdGhpcyB0aGVzaXMgaXMgdGhlIEhlZG9uaWMgUHJpY2luZyBNZXRob2QgKEhQTSksIGFsc28gb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgaGVkb25pYyByZWdyZXNzaW9uIG9yIGhlZG9uaWMgZGVtYW5kIHRoZW9yeS4gVGhlIGZ1bmRhbWVudGFsIHRoZW9yeSBiZWhpbmQgdGhlIEhQTSBpcyB0aGUgZm9sbG93aW5nOiBjb21tb2RpdGllcyBhcmUgZGlzdGluZ3Vpc2hhYmxlIGJ5IHRoZWlyIGNvbXBvbmVudCBwYXJ0cywgdGhlcmVmb3JlLCB0aGUgbWFya2V0IHZhbHVlIG9mIGEgZ2l2ZW4gY29tbW9kaXR5IGNhbiBiZSBjYWxjdWxhdGVkIGJ5IHN1bW1pbmcgdGhlIGVzdGltYXRlZCB2YWx1ZXMgb2YgaXRzIHNlcGFyYXRlIGNoYXJhY3RlcmlzdGljcy4gRm9yIHRoaXMgdGhlb3J5IHRvIGhvbGQgdHJ1ZSwgc2V2ZXJhbCBjcml0aWNhbCByZXF1aXJlbWVudCBtdXN0IGJlIG1ldC4gUHJpbWFyaWx5LCB0aGF0IHRoZSBjb21tb2RpdHkgYmVpbmcgdmFsdWVkIGNhbiBiZSByZWR1Y2VkIGRvd24gdG8gaXQncyBjb21wb25lbnQgcGFydHMgYW5kIHRoYXQgdGhlIG1hcmtldCBpcyBhYmxlIHRvIGltcGxpY2l0bHkgYW5kIGluZGVwZW5kZW50bHkgdmFsdWUgdGhlc2UgY2hhcmFjdGVyaXN0aWNzLiBUaGUgZnVsZmlsbG1lbnQgb2YgdGhlc2UgcmVxdWlyZW1lbnRzIGFyZSBub3Qgb2J2aW91cyBhbmQgaW4gcmVhbGl0eSB3aWxsIGluIHNvbWUgbWVhc3VyZSBmYWxsIHNob3J0IG9mIGFjY291bnRpbmcgZm9yIHRoZSBjb21wbGV0ZSBuYXR1cmUgb2YgcHJpY2UgZHluYW1pY3MgaW4gcHJhY3RpY2FsbHkgZXZlcnkgYXNzZXQgY2xhc3MuIEhvd2V2ZXIsIHRoaXMgbGltaXRhdGlvbiBvZmZlcnMgYW4gaW50ZXJlc3RpbmcgcHJvYmxlbSB0byB0ZXN0LiBOYW1lbHksIHRvIGZpbmQgdGhlIGxpbWl0IG9mIHRoZSBhY2N1bXVsYXRlZCBwb3dlciBvZiB0aGVzZSBjb21wb25lbnQgcGFydHMgdG8gYWNjb3VudCBmb3IgbWFya2V0IHZhbHVlcyBhbmQgdGhlaXIgZGV2aWF0aW9ucyBhY3Jvc3MgdGltZSBhbmQgc3ViZ3JvdXBzLiBUaGlzIGV4YWN0IHF1ZXN0aW9ucyB3aWxsIGJlIGxhdGVyIGV4YW1pbmVkIGJ5IGltcGxlbWVudGluZyBhIG1hY2hpbmUtbGVhcm5lZCBwcmVkaWN0aXZlIG1vZGVsIHRvIG1lYXN1cmUgdGhlIHRoZW9yZXRpY2FsIG1heGltdW0gZXhwbGFuYXRvcnkgcG93ZXIgb2YgdGhlIGluY2x1ZGVkIGhlZG9uaWMgdmFyaWFibGVzLiBJbiB0aGUgZm9sbG93aW5nIHR3byBzdWJzZWN0aW9ucywgd2UgcmV2aWV3IHRoZSBtZXRob2RzIHVzZWQgaW4gdGhpcyBwYXBlciB0byBlY29ub21ldHJpY2FsbHkgbW9kZWwgdGhlIEhQTSBvbiBoZWRvbmljIHJlYWwgZXN0YXRlIGRhdGEuCgo8YnI+CgojIyMjIDQuMSBNdWx0aS1WYXJpYWJsZSBMaW5lYXIgUmVncmVzc2lvbiAKSW4gdGhpcyBzZWN0aW9uLCBJIHdpbGwgb3V0bGluZSB0aGUgY29uc3RydWN0aW9uIG9mIG15IGJhc2UgT0xTIG1vZGVsLCB0ZXJtZWQgdGhlIEFscGhhIG1vZGVsLCBhcyB3ZWxsIGFzIHRoZSB0cmVhdG1lbnQgcHJvY2VzcyBmb3IgaGV0ZXJvc2thZGFzdGljaXR5LCBtdWx0aWNvbGluZWFyaXR5LCBub24tbGluZWFyaXR5LCBhbmQgaGlnaC1sZXZlcmFnZSBwb2ludHMgYW5kIG91dGxpZXJzLiAgCgojIyMjIyA0LjEuMSBCYXNpYyBNb2RlbCBEZXNpZ24KCkZvbGxvd2luZyB0aGUgT0xTIGNvbnN0cnVjdGlvbiBsYWlkIG91dCBieSBASGVyYXRoMToKCiQkClIgPSBmKFAsTixMLHQpCiQkCndoZXJlICRSJCBpcyByZW50IG9yIHByaWNlIG9mIHRoZSBwcm9wZXJ0eTsgJFAkIGlzIHByb3BlcnR5IHJlbGF0ZWQgYXR0cmlidXRlczsgJE4kIGlzIG5laWdoYm9yaG9vZCBjaGFyYWN0ZXJpc3RpY3M7ICRMJCBpcyBsb2NhdGlvbmFsIHZhcmlhYmxlcyBhbmQ7ICR0JCBpcyBhbiBpbmRpY2F0b3Igb2YgdGltZS4KClRoaXMgcGFwZXIncyBiYXNlIE9MUyBtb2RlbCwgbmFtZWQgdGhlIEFscGhhIG1vZGVsLCBpcyBhcyBmb2xsb3dzOgoKJCQKe1B9X3tuXHRpbWVzMX0gPSBcIEFfe25cdGltZXMxfSBcICsgXCAgQl97a1x0aW1lczF9e1Z9X3tuXHRpbWVzIGt9IFwgKyAgXCBcbWF0aGNhbHtFfV97blx0aW1lczF9CiQkCgp3aGVyZSAkUCQgaXMgYSAke25cdGltZXMxfSQgdmVjdG9yIG9mIHNvbGQgcHJpY2VzOyAkQSQgaXMgYSAke25cdGltZXMxfSQgdmVjdG9yIG9mIHRoZSBtb2RlbCdzIGludGVyY2VwdHM7ICRCJCBpcyBhICR7a1x0aW1lczF9JCB2ZWN0b3Igb2YgYmV0YSBjb2VmZmljaWVudHM7ICRWJCBpcyBhICR7blx0aW1lcyBrfSQgbWF0cml4IG9mIGFsbCBoZWRvbmljIHZhcmlhYmxlczsgJFxtYXRoY2Fse0V9JCBpcyBhICR7blx0aW1lczF9JCB2ZWN0b3Igb2YgdGhlIG1vZGVsJ3MgcmFuZG9tIGVycm9yOyBzdWJzY3JpcHQgJG4kIGlzIHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGFuZDsgJGskIGlzIHRoZSBsZW5ndGggb2YgdGhlIHZhcmlhYmxlIGxpc3QuCgo8YnI+CgojIyMjIyA0LjEuMiBBY2NvdW50aW5nIGZvciBIZXRlcm9zY2FkYXN0aWNpdHkKQSBCcmV1c2NoLVBhZ2FuIHRlc3Qgd2FzIGNvbmR1Y3RlZCBvbiBhIHN0YW5kYXJkIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdpdGggc29sZCBwcmljZSBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCB0aGUgcmVzdCBvZiB0aGUgZGF0YXNldCBhcyByZWdyZXNzb3JzLiBUaGUgQnJldXNjaC1QYWdhbiAoQlApIHRlc3Qgd2FzIGVzdGFibGlzaGVkIGFzIGEgbWV0aG9kIGluIDE5NzkgYW5kIGZvbGxvd3MgdGhlIGxvZ2ljIHNldCBieSB0aGUgTGFncmFuZ2UgbXVsdGlwbGllciB0ZXN0IHByaW5jaXBsZSBbQEJyZXVzY2hdLiBUaGlzIHRlc3QgdGVzdHMgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSB2YXJpYW5jZSBpbiB0aGUgbW9kZWwncyBlcnJvcnMgaXMgaW5kZXBlbmRlbnQgZnJvbSBtb2RlbCdzIHJlZ3Jlc3NvcnMgKGkuZS4gaGV0ZXJvc2NhZGFzdGljaXR5KS4gVGhlIHRlc3QncyByZXN1bHRzIGluIGEgcmVqZWN0aW9ucyBvZiB0aGUgbnVsbCBoeXBvdGhlc2lzLCB0aGVyZWJ5IGZpbmRpbmcgdGhlIGJhc2UgbW9kZWwgdG8gYmUgaGV0ZXJvc2tlZGFzdGljLiBUaGUgcmVzdWx0cyBvZiB0aGlzIHRlc3QgYXJlIHN1bW1hcml6ZWQgaW4gKnRhYmxlIHgqLgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvRGF0YSBDb2xsZWN0aW9pbi9icF90ZXN0LnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KClRvIHJlc29sdmUgdGhlIGhldGVyb3NrYWRhc3RpY2l0eSBmb3VuZCBpbiDCpzMuNC4xLCBJIHdpbGwgcHJvZHVjZSBoZXRlcm9za2VkYXN0aWNpdHktY29uc2lzdGVudCAoSEMpIHN0YW5kYXJkIGVycm9ycywgYWxzbyBrbm93biBhcyBoZXRlcm9za2VkYXN0aWNpdHktcm9idXN0IHN0YW5kYXJkIGVycm9ycywgdGhyb3VnaCB0aGUgcmVmaW5lZCBtZXRob2QgZXN0YWJsaXNoZWQgYnkgZWNvbm9tZXRyaWNpYW4gSGFsYmVydCBMeW5uIFdoaXRlIFtAV2hpdGVdLlRoaXMgcHJvY2VzcyBpcyBhcyBmb2xsb3dzOgoKSWYgdGhlIG1vZGVsJ3MgZXJyb3JzICR1X3tpfSQgYXJlIGluZGVwZW5kZW50LCBidXQgaGF2ZSBkaXN0aW5jdCB2YXJpYW5jZXMgJFxzaWdtYSBfe2l9XnsyfSQgdGhlbiAkXFNpZ21hID1cb3BlcmF0b3JuYW1le2RpYWd9KFxzaWdtYSBfezF9XnsyfSxcbGRvdHMgLFxzaWdtYSBfe259XnsyfSkkIHdoaWNoIGNhbiBiZSBlc3RpbWF0ZWQgd2l0aCAke1xkaXNwbGF5c3R5bGUge1x3aWRlaGF0IHtcc2lnbWEgfX1fe2l9XnsyfT17XHdpZGVoYXQge3V9fV97aX1eezJ9fSQuIFRoaXMgcmVsYXRpb25zaGlwIHByb2R1Y2VzIHRoZSBlc3RpbWF0b3IgZm91bmQgaW4gQFdoaXRlOgoKPGJyPgoKJCQge1xkaXNwbGF5c3R5bGUge1xiZWdpbnthbGlnbmVkfXZfe1x0ZXh0e0hDRX19XGxlZnRbe1x3aWRlaGF0IHtcYmV0YSB9fV97XHRleHR7T0xTfX1ccmlnaHRdJj17XGZyYWMgezF9e259fVxsZWZ0KHtcZnJhYyB7MX17bn19XHN1bSBfe2l9WF97aX1YX3tpfSdccmlnaHQpXnstMX1cbGVmdCh7XGZyYWMgezF9e259fVxzdW0gX3tpfVhfe2l9WF97aX0ne1x3aWRlaGF0IHt1fX1fe2l9XnsyfVxyaWdodClcbGVmdCh7XGZyYWMgezF9e259fVxzdW0gX3tpfVhfe2l9WF97aX0nXHJpZ2h0KV57LTF9XGVuZHthbGlnbmVkfX19JCQKJCR7XGRpc3BsYXlzdHlsZSB7XGJlZ2lue2FsaWduZWR9Jj0oXG1hdGhiYiB7WH0gJ1xtYXRoYmIge1h9ICleey0xfShcbWF0aGJiIHtYfSAnXG9wZXJhdG9ybmFtZSB7ZGlhZ30gKHtcd2lkZWhhdCB7dX19X3sxfV57Mn0sXGxkb3RzICx7XHdpZGVoYXQge3V9fV97bn1eezJ9KVxtYXRoYmIge1h9ICkoXG1hdGhiYiB7WH0gJ1xtYXRoYmIge1h9ICleey0xfSxcZW5ke2FsaWduZWR9fX0kJAoKPGJyPgoKd2hlcmUgJFxtYXRoYmJ7WH0kIGRlbm90ZXMgdGhlIG1hdHJpeCBvZiBzdGFja2VkICRYX2knJCB2YWx1ZXMgZnJvbSB0aGUgZGF0YS4gVGhlIGVzdGltYXRvciBjYW4gYmUgZGVyaXZlZCBpbiB0ZXJtcyBvZiB0aGUgZ2VuZXJhbGl6ZWQgbWV0aG9kIG9mIG1vbWVudHMgKEdNTSkuCgpGb3IgdGhlIHJlbWFpbmRlciBvZiB0aGlzIHRoZXNpcywgYWxsIHN0YXRlbWVudHMgYW5kIGZpZ3VyZXMgcmVnYXJkaW5nIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSB3aWxsIGJlIHJlZmVycmluZyB0byB0ZXN0cyBjb25kdWN0ZWQgd2l0aCBoZXRlcm9za2VkYXN0aWNpdHktY29uc2lzdGVudCAoSEMpIHN0YW5kYXJkIGVycm9ycy4gQXMgc2FtcGxlIGVycm9ycyBpbiBteSBtb2RlbHMgd2lsbCBoYXZlIGVxdWFsIHZhcmlhbmNlIGFuZCBhcmUgdW5jb3JyZWxhdGVkLCB0aGUgbGVhc3Qtc3F1YXJlcyBlc3RpbWF0ZXMgb2YgZWFjaCBtb2RlbCdzIGJldGEgY29lZmZpY2llbnRzIGFyZSByZWdhcmRlZCBhcyBCZXN0IExpbmVhciBVbmJpYXNlZCBFc3RpbWF0b3JzIChCTFVFcykuCgo8YnI+CgojIyMjIyA0LjEuMyBBY2NvdW50aW5nIGZvciBNdWx0aWNvbGluZWFyaXR5Ck11bHRpY29saW5lYXJpdHkgaXMgbWVhc3VyZWQgdXNpbmcgVmFyaWFuY2UgSW5mbGF0aW9uIEZhY3RvcnMgKFZJRikuIFRoZSBWSUYgb2YgYSBwcmVkaWN0b3IgbWVhc3VyZXMgaG93IGFjY3VyYXRlbHkgdGhhdCB2YXJpYWJsZSBjYW4gYmUgcHJlZGljdGVkIHVzaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMuIEZvciBjb250ZXh0LCB0aGUgc3F1YXJlIHJvb3Qgb2YgYSBWSUYgcmVwcmVzZW50cyB0aGUgaW5jcmVhc2UgaW4gc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNhc2Ugd2hlbiB0aGF0IGdpdmVuIHZhcmlhYmxlIGlzIGluZGVwZW5kZW50IG9mIGFsbCBvdGhlciB2YXJpYWJsZXMuIElubGluZSB3aXRoIGN1cnJlbnQgY29udmVudGlvbiwgYWxsIHZhcmlhYmxlcyB3aXRoIGEgVklGIGxhcmdlciB0aGFuIDUgYXJlIGVsaW1pbmF0ZWQuIEEgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGFsbCB2YXJpYWJsZSBtdWx0aWNvbGluZWFyaXR5LCBtZWFzdXJlZCBieSBWSUYsIGlzIHNob3duIGluIGltYWdlIHguCgpUaGlzIHRlc3QgcmVzdWx0ZWQgaW4gdGhlIGVsaW1pbmF0aW9uIG9mIHRoZSB2YXJpYWJsZXMgKioqbGlzdF9wcmljZSoqKiBhbmQgKioqYXJlYV90b3RhbCoqKiBhbmQgdGhlcmUgd2VyZSBoaWdobHkgbXVsdGljb2xpbmVhciB3aXRoICoqKnNvbGRfcHJpY2UqKiogYW5kICoqKmFyZWFfbGl2aW5nKioqIHJlc3BlY3RpdmVseS4KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L011bHRpX2NvbGluL011bHRpX2NvX2NvbWJpbmVkLnBuZyl7d2lkdGg9ODAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDQuMS40IEFjY291bnRpbmcgZm9yIE5vbi1saW5lYXJpdGllcwpJIHZpc3VhbCBhbmFseXNpcyB3YXMgY29uZHVjdGVkIG9uIGFsbCBjb250aW51b3VzIHZhcmlhYmxlcyBhbmQgbm9uLWxpbmVhciB2YXJpYWJsZXMgdHJhbnNmb3JtYXRpb24gd2VyZSBhZGRlZCB0byAqKiphZ2UqKiogYW5kICoqKmFyZWFfbGl2aW5nKioqCgoqQWdlOioKCkFuIGFuYWx5c2lzIG9mIGFnZSB2cy4gc29sZCBwcmljZSBzaG93cyBhIHdlbGwtZXN0YWJsaXNoZWQgdS1zaGFwZWQgcGF0dGVybi4gSW4gb3JkZXIgdG8gYWxsb3cgdGhlIE9MUyBtb2RlbCB0byBiZXR0ZXIgY2FwdHVyZSB0aGlzIHJlbGF0aW9uc2hpcCwgYSBuZXcgdmFyaWFibGUgJGFnZV4yJCBpcyBhZGRlZCB0byB0aGUgbW9kZWwuIAoKSW1hZ2UgeCBzaG93cyB0aGUgUGFydGlhbCBEZXBlbmRlbmN5IFBsb3QgKFBEUCkgb2YgYWdlIHdpdGhpbiB0aGUgQWxwaGEgbW9kZWwuIFRoaXMgcGxvdHMgdGhlIG1hcmdpbmFsIHByZWRpY3Rpb24gb2YgdGhlIEFscGhhIG1vZGVsIGFjcm9zcyB0aGUgZnVsbCByYW5nZSBvZiBhZ2UuIFdoZW4gdGhlIHNjYWxlIG9mIHRoZSB5LWF4aXMgaXMgcmVkdWNlZCwgd2Ugc2VlIHRoZSBzbGlnaHQgY3VydmF0dXJlIGluIEFscGhhIG1vZGVsJ3MgZXN0aW1hdGlvbiBvZiBhZ2UgZWZmZWN0cy4gVGhpcyBhZGRpdGlvbiBpbXByb3ZlZCAkUl4yJCBieSAkLjA4JC4gCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9Ob25saW5lYXJpdGllcy9hZ2Vfbm9uX2xpbl9jb20ucG5nKXt3aWR0aD0xMDAlfQo8L2NlbnRlcj4KCjxicj4KCipMaXZpbmcgQXJlYToqCgpBbiBhbmFseXNpcyBvZiBsaXZpbmctYXJlYSB2cy4gc29sZCBwcmljZSByZXZlYWxzIGEgU2lnbW9pZCBwYXR0ZXJuIGJldHdlZW4gdGhlIHR3byB2YXJpYWJsZXMuIEluIG9yZGVyIHRvIGFsbG93IHRoZSBPTFMgbW9kZWwgdG8gYmV0dGVyIGNhcHR1cmUgdGhpcyByZWxhdGlvbnNoaXAsIGEgbmV3IHZhcmlhYmxlICRsaXZpbmcgXCBhcmVhXjIkIGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4gCgpJbWFnZSB4IHNob3dzIHRoZSBQYXJ0aWFsIERlcGVuZGVuY3kgUGxvdCAoUERQKSBvZiAkbGl2aW5nIFwgYXJlYV4yJCB3aXRoaW4gdGhlIEFscGhhIG1vZGVsLiBUaGlzIGFkZGl0aW9uIGltcHJvdmVkICRSXjIkIGJ5ICQuMDYkLgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvTm9ubGluZWFyaXRpZXMvbGl2aW5nX2FyZWFfbm9uX2xpbl9jb20ucG5nKXt3aWR0aD0xMDAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDQuMS41IEFjY291bnRpbmcgZm9yIEhpZ2gtTGV2ZXJhZ2UgUG9pbnRzIGFuZCBPdXRsaWVycwpBZnRlciB0aGUgYWRqdXN0bWVudHMgb3IgdGhlIHByZXZpb3VzIHNlY3Rpb25zIGhhdmUgYmVlbiBtYWRlLCBhIHBhbmVsIG9mIHZpc3VhbGl6YXRpb25zIGFyZSBydW4gb24gdGhlIEFscGhhIG1vZGVsLiBUaGUgcmVzdWx0cyBzaG93IG5vIGV4dHJlbWUgb3V0bGllcnMgYW5kIG9ubHkgb25lIGhpZ2gtbGV2ZXJhZ2UgcG9pbnQgKG9icyAjMjM1MTUpLCBhcyBzaG93cyBieSB0aGUgcmVzaWR1YWwgdnMuIGxldmVyYWdlIHBsb3QgaW4gcXVhZHJhbnQgdHdvIG9mIGltYWdlIFgsIHdoaWNoIGlzIHJlbW92ZWQgaW4gdGhlIGZpbmFsIEFscGhhIG1vZGVsLiBUaGVzZSByZXN1bHRzIGFyZSBtYWlubHkgZHVlIHRvIHRoZSBwcmV2aW91cyByZW1vdmFsIG9mIG91dGxpZXJzIGluIMKnMy4yIGFuZCB0aGUgb3ZlcmFsbCBxdWFsaXR5IG9mIHRoZSBkYXRhIHNldC4gCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9hbHBoYV9wbG90cy5wbmcpe3dpZHRoPTcwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA0LjEuNiBGaW5hbCBBbHBoYSBNb2RlbApVbmRlciBDb25zdHJ1Y3Rpb24KClRoZSBBbHBoYSBtb2RlbCBpcyB0aGUgYmFzZWxpbmUgT0xTIGZvciB0aGlzIHRoZXNpcyBhbmQgaXMgcmVidXN0IHRvIGhldGVyb3NrYWRhc3RpY2l0eSwgbXVsdGljb2xpbmVhcml0eSwgbm9uLWxpbmVhcml0aWVzLCBoaWdoLWxldmVyYWdlIHBvaW50cyBhbmQgb3V0bGllcnMuIFRoZXNlIGhpZ2gtbGV2ZWwgYWRqdXN0bWVudCBpbmNyZWFzZSBvdXIgY29uZmlkZW5jZSBpbiB0aGUgc3RhdGlzdGljYWwgdGVzdHMgcmVzdWx0cyB3aGljaCBmb2xsb3cgIAoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvQWxwaGFfbW9kZWxfZmluYWwucG5nKXt3aWR0aD03MCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyA0LjMgTW9kZWxpbmcgQ2hhbmdlcyBpbiBEZW1hbmQgZm9yIEhlZG9uaWMgRmVhdHVyZXMKVGhlIGZvY3VzIG9mIHRoaXMgdGhlc2lzIGlzIGhvdyB0aGUgQ292aWQgY3Jpc2lzIGltcGFjdGVkIGhvdXNpbmcgcHJpY2VzIGFuZCB0aGUgcmVsYXRpdmUgbGV2ZWxzIG9mIGRlbWFuZCBmb3Igc3BlY2lmaWMgaGVkb25pYyBmZWF0dXJlcy4gSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIEhQTSBpcyBpbiB0aGUgT0xTIGZ1bmN0aW9uYWwgZm9ybSwgdGhlIGJldGEgY29lZmZpY2llbnRzIG9mIHRoaXMgbW9kZWwgcmVwcmVzZW50IHJlbGF0aXZlIGRlbWFuZCBmb3IgZWFjaCBhc3NvY2lhdGVkIGhlZG9uaWMgZmVhdHVyZSBbQFNoaW1penVdLiBGb3IgZXhhbXBsZSwgJFxiZXRhX3twb29sID0gMX0gPTExLDg1NiQgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIGF2ZXJhZ2UgY29uc3VtZXIncyB3aWxsaW5nbmVzcyB0byBwYXkgZm9yIGFuIGF2ZXJhZ2UgcG9vbCwgY2V0ZXJpcyBwYXJhYnVzLiBIb3dldmVyLCB0aGlzIHRoZXNpcyB3aXNoZXMgdG8gbWVhc3VyZSB0aGUgKmNoYW5nZXMqIGluIHRoZSBhdmVyYWdlIGNvbnN1bWVyJ3Mgd2lsbGluZ25lc3MgdG8gcGF5IGZvciBhIGdpdmVuIGZlYXR1cmUgKGUuZy4gcG9vbCkgaW4gcmVsYXRpb25zaGlwIGEgbWVhc3VyZW1lbnQgb2YgQ292aWQncyBlY29ub21pYyBpbXBhY3QuIAoKIyMjIyMgNC4zLjEgQ29tcGFyaXNvbiBNZXRob2QKQSBtZXRob2Qgb2Ygc3RhdGlzdGljYWxseSBjb21wYXJpbmcgY2hhbmdlcyBpbiB0aGUgYmV0YSBjb2VmZmljaWVudHMgb2YgcGFydGljdWxhciBmZWF0dXJlcyBvZiBpbnRlcmVzdCB1bmRlciBtdWx0aXBsZSBzY2VuYXJpb3MgKGUuZy4gcG9zdCBhbmQgcHJlLWNvcm9uYSBwZXJpb2QpIGlzIG5lZWRlZC4gVG8gYWNjb21wbGlzaCB0aGlzLCBhIG1ldGhvZCBvdXRsaW5lZCBieSB0aGUgVUNMQSBTdGF0aXN0aWNzIGRlcGFydG1lbnQgaXMgaW1wbGVtZW50ZWQgW0BCcnVpbl0uIFRoZSBiZXN0IHdheSB0byB1bmRlcnN0YW5kIHRoaXMgbWV0aG9kIGlzIHRvIHNlZSBhIHNpbXBsZXN0IHJlcHJvZHVjaWJsZSBleGFtcGxlLgoKU3VwcG9zZSB3ZSB3YW50IHRvIHRlc3QgdGhlIGVjb25vbWljIGltcGFjdCBvZiBDb3JvbmEgb24gdGhlIHJlbGF0aXZlIGRlbWFuZCBmb3Igc3dpbW1pbmcgcG9vbHMsICRcYmV0YV97cG9vbCA9IDF9JCBhbmQgJHBvb2wkIHJlc3BlY3RpdmVseS4gVXNpbmcgdGhlIFVDTEEgbWV0aG9kLCB3ZSB0ZXN0IHRoZSBudWxsIGh5cG90aGVzaXMgJEhfMDpcYmV0YV97cG9vbCA9IDEsXCBjb3JvbmEgPSAwfSA9IFxiZXRhX3twb29sID0gMSxcIGNvcm9uYSA9IDF9JCB3aXRoIHRoZSBmb2xsb3dpbmcgT0xTCgo8YnI+CgokJAp7c29sZCBcIHByaWNlfSA9IFxhbHBoYSBcICsgXGJldGFfMSB7cG9vbH0gXCArIFwgIFxiZXRhXzIge2Nvcm9uYX0gXCArIFxiZXRhXzMgeyhwb29sIFx0aW1lcyBjb3JvbmEpfQokJAo8YnI+CgpXaGljaCByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmc6Cgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9VQ0xBX291dHB1dF8xLnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KClRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHNpbXBsaWZpZWQgbW9kZWwncyBlc3RpbWF0ZXMgYXJlOgoKKiBJbnRlcmNlcHQ6IEludGVyY2VwdCBmb3IgJHBvb2wgPSAwJCAKICAgKyBUaGUgb21pdGVkIGdyb3VwCiogcG9vbDogU2xvcGUgZm9yICRwb29sID0gMSQKICAgKyBUaGUgaW5jbHVkZWQgZ3JvdXAKKiBpbmZlY3Rpb25zIHBlcmlvZDogJCgkSW50ZXJjZXB0ICRpbmZlY3Rpb25zIFwgcGVyaW9kID0gMSkkICQtJCAkKCRpbnRlcmNlcHQgJGluZmVjdGlvbnMgXCBwZXJpb2QgPSAwKSQKICAgKyBUaGlzIGNhbiBiZSBzZWVuIGJ5IHJ1bm5pbmcgaW5kaXZpZHVhbCByZWdyZXNzaW9ucyBmb3IgZWFjaCBjYXNlCiogKHBvb2wqaW5mZWN0aW9ucyBwZXJpb2QpOiBTbG9wZSBmb3IgJHBvb2xfe2luZmVjdGlvbnMgXCBwZXJpb2QgPSAxfSQgJC0kICRwb29sX3tpbmZlY3Rpb25zIFwgcGVyaW9kID0gMH0kIAogICArIFRoaXMgZXN0aW1hdGUgdGVzdHMgdGhlIG51bGwgaHlwb3RoZXNpcyAkSF8wOiBcYmV0YV97cG9vbCA9IDEsXCBjb3JvbmEgPSAwfSA9IFxiZXRhX3twb29sID0gMSxcIGNvcm9uYSA9IDF9JAoKPGJyPgoKVGhlcmVmb3JlLCB3ZSBzYXk6Cgo+IFRoZSBhdmVyYWdlIHByZW1pdW0gZm9yIGEgcHJvcGVydHkgaGF2aW5nIGEgKipzd2ltbWluZyBwb29sKiogZmVsbCBieSAqKiQ3LDc2Ni40MCoqIHdoZW4gY29tcGFyZWQgdG8gcHJlLWNvcm9uYSBsZXZlbHMsIGNldGVyaXMgcGFyYWJ1cy4gSG93ZXZlciwgdGhpcyBmaW5kaW5nIGlzIG9ubHkgc2lnbmlmaWNhbnQgYXQgdGhlICoqKnAgPCAwLjEwKioqIGxldmVsLiAgCgo8YnI+CgojIyMjIyA0LjMuMiBTZWxlY3RpbmcgYSBDb3JvbmEgTWVhc3VybWVudApBIGdvb2QgbWVhc3VyZW1lbnQgdmFyaWFibGUgZm9yIG1lYXN1cmluZyB0aGUgcmVzcG9uc2Ugb2YgdGhlIG1hcmtldCB0byB0aGUgY29yb25hIGNyaXNpcyBtdXN0IGJlIGEgY29yb25hLXJlbGF0ZWQgbWF0cmljIHdoaWNoIGlzIHB1YmxpY2x5IGF2YWlsYWJsZTsgY29tbW9uIGtub3dsZWRnZSB0byB0aGUgcG9wdWxhdGlvbiBhbmQ7IGlzIGEgcmVhc29uYWJsZSBtZWFzdXJlbWVudCBvZiBmdXR1cmUgZWNvbm9taWMgc2hpZnRzLiBGb3IgdGhpcyByZWFzb24sIGRhdGEgY29sbGVjdGVkIGZyb20gdGhlIExvdWlzaWFuYSBEZXBhcnRtZW50IG9mIEhlYWx0aCBbQExhREhdIHdhcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgMy1tb250aCBtb3ZpbmcgYXZlcmFnZSBvZiBjb3JvbmEgaW5mZWN0aW9ucyAoaW5mZWN0aW9uc18zbW1hKS4KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ29yb25hX0dlbmVyYWwvV2F2ZXNfb2ZfaW5mZWN0aW9uLnBuZyl7d2lkdGg9NzAlfQo8L2NlbnRlcj4KCjxicj4KClRoaXMgbWVhc3VyZW1lbnQgZnVsZmlsbHMgdGhlIHByZXZpb3VzbHkgc3RhdGVkIHJlcXVpcmVtZW50cyBvZiBhIGdvb2QgdGVzdCBtZWFzdXJlbWVudCBhcyBpdCBpcyBwdXJlbHkgcmVsYXRlZCB0byB0aGUgY29yb25hIGNyaXNpcywgaXMgcHVibGljbHkgYXZhaWxhYmxlLCBpcyBhc3N1bWVkIHRvIGJlIHB1YmxpY2x5IGtub3duIGFzIGl0IGlzIHJlcG9ydGVkIGFjcm9zcyBhbGwgbWFqb3IgbmV3cyBzdGF0aW9ucyBkYWlseSwgYW5kIHBlcmhhcHMgbW9zdCBpbXBvcnRhbnRseSwgaXMgdGhlIHByaW1hcnkgbWV0cmljIHVzZWQgdG8gZGVjaWRlIHdoZW4gbWFuZGF0b3J5IGxvY2tkb3ducyBhcmUgaW5zdGl0dXRlZC4gRm9yIHRoaXMgdGhlc2lzLCBpdCBpcyBhc3N1bWUgdGhlIG1hcmtldCBpcyByZXNwb25kaW5nIHRvIHNvbWUgbGFnZ2VkIHZhbHVlIG9mIGRhaWx5IGluZmVjdGlvbnMgd2hpY2ggYXJlIGJlaW5nIHVzZWQgYnkgY29uc3VtZXJzIHRvIGVzdGltYXRlIHRoZSBsaWtlbGlob29kIG9mIGZ1dHVyZSBsb2NrZG93bnMgYW5kIHRoZSBzdHJpbmdlbmN5LCBhbmQgZHVyYXRpb24gb2YgY3VycmVudCBsb2NrZG93bnMuIFdpdGggdGhpcyByYXRpb25hbCwgaW5mZWN0aW9uc18zbW1hIGlzIHNlbGVjdGVkIGFzIHRoZSBwcmltYXJ5IG1lYXN1cmVtZW50IG9mIGNvcm9uYSdzIGltcGFjdC4gCgo8YnI+PGJyPgoKIyMjIyA0LjQgTWFjaGluZSBMZWFybmluZyAKCiMjIyMjIDQuNC4xIE1hY2hpbmUgTGVhcm5pbmcgTWV0aG9kcwoKSW4gdGhlIHByZXZpb3VzIHN1YnNlY3Rpb24gNC4xLCBpdCB3YXMgc3RhdGVkIHRoYXQgdGhlIG11bHRpdmFyaWFibGUgcmVncmVzc2lvbiBtb2RlbHMgZXN0aW1hdGUgYSB2ZWN0b3Igb2YgcGFyYW1ldGVycyAoaS5lLiBiZXRhIGNvZWZmaWNpZW50cykgdGhhdCBiZXN0IGZpdCB0aGUgZXhwbGFuYXRvcnkgaGVkb25pYyB2YXJpYWJsZXMgdG8gdGhlIGFzc29jaWF0ZWQgZGVwZW5kZW50IHZhcmlhYmxlLiBJbnR1aXRpdmVseSwgdGhlIHJlc3VsdGluZyBmaXR0ZWQgY29lZmZpY2llbnQgdmVjdG9yIGlzIGZpdHRlZCB0byB0aGUgZW50aXJlIGRhdGEgc2V0LCBhbmQgdGhlcmVmb3JlLCB0aGUgbG9zcyBmdW5jdGlvbiBtaW5pbWl6ZXMgdGhlIGVycm9yIGluIHRoZSBtb2RlbCdzIGFiaWxpdHkgdG8gKmV4cGxhaW4qIHRoZSB2ZXJ5IGluZGVwZW5kZW50IHZhcmlhYmxlIGl0IHdhcyBmaXR0ZWQgdG8uIEluIG90aGVyIHRlcm1zLCB0aGVzZSByZXN1bHRzIGFyZSB1bHRpbWF0ZWx5IGxpbWl0ZWQgdG8gdGhlaXIgaW5mZXJlbnRpYWwgdmFsdWUgd2l0aGluIHRoZSBleGFjdCBjb250ZXh0IG9mIHRoZSBkYXRhIHNldCB0aGUgbW9kZWwgaXMgdHJhaW5lZCBvbi4gSWYgb25lIGlzIHRvIGVzdGFibGlzaCBhIHdpZGVyLCBtb3JlIGdlbmVyYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gZGVwZW5kZW50IGFuZCBpbmRlcGVuZGVudCB2YXJpYWJsZXMgdGhhdCBnbyBiZXlvbmQgdGhlIGNvbnRleHQgb2YgdGhlIHRyYWluZWQgZGF0YSBzZXQsIHN1cGVydmlzZWQgbWFjaGluZSBsZWFybmluZyAoTUwpIHByZWRpY3Rpb24gbW9kZWxzIGFyZSBhbiBleHRyZW1lbHkgcG93ZXJmdWwgdG9vbCB0byBkbyBzby4gVGhvdWdoIHRoZSBtb2RlbHMgdXNlZCBpbiB0aGlzIHRoZXNpcyBkaWZmZXIgYWNyb3NzIHNldmVyYWwga2V5IHByb2Nlc3NlcywgdGhleSBlYWNoIGdlbmVyYWxseSBmb2xsb3cgYSBzaW1pbGFyIGxvZ2ljOiAKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L01MX1Byb2Nlc3NfMi5wbmcpe3dpZHRoPTcwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA0LjQuMiBNb2RlbCBFdmFsdWF0aW9uIHdpdGggQ3Jvc3MtVmFsaWRhdGlvbgoKSW4gb3JkZXIgdG8gcmFuayBvcmRlciBtb2RlbHMsIHdlIHBlcmZvcm0gYSBwcm9jZXNzIGNhbGxlZCBDcm9zcy1WYWxpZGF0aW9uIChDVikuIEZpcnN0LCB0aGUgZnVsbCBkYXRhIHNldCBtdXN0IGJlIHNwbGl0IGludG8gJ3Rlc3QnIGFuZCAndHJhaW4nIChpLmUuIHZhbGlkYXRpb24pIHN1YnNldHMuIEVhY2ggTUwgbW9kZWwgd2lsbCBiZSBmaXR0ZWQgdG8gdGhlIHRyYWluIGRhdGEgc2V0IGFuZCBpdCdzIHBlcmZvcm1hbmNlIHdpbGwgYmUgZXZhbHVhdGVkIGJhc2VkIHRoZSBtb2RlbCdzIGFiaWxpdHkgdG8gcHJlZGljdGVkIG91dC1vZi1zYW1wbGUgb2JzZXJ2YXRpb25zIGluIHRoZSB0ZXN0ICh2YWxpZGF0aW9uKSBkYXRhIHNldC4gSW4gdGhpcyB3YXksIHRoZXNlIG1vZGVscyBhcmUgcmFua2VkIGJhc2VkIG9uIHRoZWlyIHRlc3QgbWVhbiBzcXVhcmVkIGVycm9ycyAoTVNFKS4gVGhpcyBwcm9jZXNzIGlzIG9mdGVuIHJlZmVycmVkIHRvIGFzIENyb3NzIFZhbGlkYXRpb24gKENWKS4gVGhlIHR3byBtb3N0IGNvbW1vbmx5IHVzZWQgQ1YgbWV0aG9kcyBhcmUgdGhlIFZhbGlkYXRpb24gU2V0IEFwcHJvYWNoIGFuZCBLLUZvbGQgQ3Jvc3MgVmFsaWRhdGlvbi4gCgpUaGUgVmFsaWRhdGlvbiBTZXQgQXBwcm9hY2ggKFZTQSkgaXMgdGhlIHNpbXBsZXN0IGNhc2Ugb2YgY3Jvc3MgdmFsaWRhdGlvbiBkYXRhIHNwbGl0dGluZyBhcyBpdCByYW5kb21seSBzcGxpdHMgdGhlIGVudGlyZSBkYXRhIHNldCBpbnRvIHRyYWluIGFuZCB0ZXN0IHN1YnNldHMgYmFzZWQgb24gYSBjZXJ0YWluIHBlcmNlbnRhZ2Ugc3BsaXQuIEZvciBleGFtcGxlLCB0aGUgcmVzZWFyY2hlciBjYW4gY2hvb3NlIHRvIHNwbGl0IHRoZSBkYXRhIHNldCB3aXRoIGEgODAlIHRyYWluaW5nIGFuZCAyMCUgdGVzdGluZyBzcGxpdC4gVGhlIGVzdGltYXRpb24gZm9yIHRoZSB0ZXN0IE1TRSBpcyBzaW1wbHkgdGhlIHRlc3QgZXJyb3IgYWdhaW5zdCB0aGUgdGVzdCBkYXRhIHNldC4KCjxicj4KCjxjZW50ZXI+ICpUZXN0IE1TRSBFc3RpbWF0aW9uIEVxdWF0aW9uKiA8L2NlbnRlcj4KCiQkQ1Zfe3ZzYX0gPSBNU0Vfe3ZzYX0kJAoKPGJyPgoKPGNlbnRlcj4KCiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1ZhbF9TZXQucG5nKXt3aWR0aD01MCV9CjwvY2VudGVyPgoKPGJyPgoKVGhlIEstRm9sZCBDViBtZXRob2QgaGFzIGluY3JlYXNpbmdseSBiZWVuIHVzZWQgYnkgcmVzZWFyY2hlcyBhcyBpdCBvZmZlcnMgYSBtb3JlIGNvbXByZWhlbnNpdmUgY3Jvc3MgdmFsaWRhdGlvbiBwcm9jZXNzIHdoZW4gY29tcGFyZWQgdG8gb3RoZXIgbWV0aG9kcy4gSy1Gb2xkIENWIGlzIHRoZSBwcm9jZXNzIG9mIHJhbmRvbWx5IHNwbGl0dGluZyB0aGUgZW50aXJlIGRhdGEgc2V0IGludG8gayBncm91cHMsIG9yIGZvbGRzLCBlYWNoIHdpdGggYXBwcm94aW1hdGVseSBhbiBlcXVhbCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zLiBUaGUgZmlyc3QgZm9sZCBpcyBoZWxkIG91dCBhbmQgdGhlIG1vZGVsIGlzIHRyYWluZWQgb24gdGhlIHJlbWFpbmluZyBrLTEgZm9sZHMuIFRoaXMgcHJvY2VzcyBpcyByZXBlYXRlZCBrIHRpbWVzLCBlYWNoIHRpbWUgaG9sZGluZyBvdXQgYSBkaWZmZXJlbnQgZm9sZCB1bnRpbCBldmVyeSBmb2xkIGhhcyBiZWVuIHRyZWF0ZWQgYXMgdGhlIHZhbGlkYXRpb24gc2V0LiBGaW5hbGx5LCB0aGlzIHdpbGwgcmVzdWx0cyBpbiBrIGVzdGltYXRpb25zIG9mIHRoZSBtb2RlbCdzIHRlc3QgZXJyb3IgYW5kIHRoZSBmaW5hbCBlc3RpbWF0aW9uIHdpbGwgYmUgdGhlIGF2ZXJhZ2UgYWNyb3NzIGFsbCBrIG1vZGVsIGZpdHMuIAoKPGJyPgoKPGNlbnRlcj4gKlRlc3QgTVNFIEVzdGltYXRpb24gRXF1YXRpb24qIDwvY2VudGVyPgoKJCRDVl97ay1mb2xkfSA9IFxmcmFjezF9e2t9XHN1bV97dD0xfV57a30gTVNFX2kkJAoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvS19Gb2xkLnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDQuNC40IE1MIE1vZGVsIFNlbGVjdGlvbiAKRm9yIHRoaXMgdGhlc2lzLCBNTCBtb2RlbHMgd2lsbCBiZSByYW5rZWQgYmFzZWQgb24gdHdvIGZlYXR1cmVzOiBBY2N1cmFjeSwgYXMgbWVhc3VyZWQgYnkgdGVzdCBNU0UsIGFuZCBpbnRlcnByZXRhYmlsaXR5LCBxdWFsaXRhdGl2ZWx5IGRlZmluZWQgYnkgdGhlIG1vZGVsJ3MgYWJpbGl0eSB0byBwcm92aWRlIGluc2lnaHRzIGludG8gdG8gd2hpY2ggZmVhdHVyZXMgYXJlIHJlbGV2YW50IHRvIHRoZSBhYmlsaXR5IHRvIG1ha2UgY29ycmVjdCBwcmVkaWN0aW9ucywgYW5kIGJ5IGhvdyBtdWNoIGFyZSB0aGV5IHJlbGV2YW50LgoKKkFjY3VyYWN5KgoKU2luY2UgYSBtZXRob2Qgb2YgbW9kZWwgZml0dGluZyBhbmQgZXZhbHVhdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIENyb3NzIFZhbGlkYXRpb24sIHdlIG5vdyBoYXZlIGEgd2F5IHRvIHJhbmsgZGlmZmVyZW50IG1vZGVscyB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHRoZWlyIGFiaWxpdHkgdG8gZXN0aW1hdGUgdGVzdCBNU0UuIFdpdGggdGhpcyBmZWF0dXJlLCBpdCBpcyBwb3NzaWJsZSB0byBjb21wYXJlIHNldmVyYWwgbW9kZWxzIHRvIG9uZSBhbm90aGVyIGluIHRlcm1zIG9mIGVmZmVjdGl2ZW5lc3MgaW4gcHJlZGljdGlvbnMuIEZpdmUgZGlmZmVyZW50IE1MIG1vZGVscyB3ZXJlIGJ1aWxkIGZvciB0aGlzIHRoZXNpcyB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdWx0czoKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L0RhdGEgQ29sbGVjdGlvaW4vbWxfcmVzdWx0cy5wbmcpe3dpZHRoPTQwJX0KPC9jZW50ZXI+Cgo8YnI+CgoqSW50ZXJwcmV0YWJpbGl0eSoKCkEgbWFqb3IgY3JpdGljaXNtIG9mIE1MIG1vZGVscyBhcmUgdGhlaXIgbGFjayBvZiBpbnRlcnByZXRhYmlsdHksIGV4cGxhaW5pbmcgKmhvdyogdGhlIG1vZGVsIG1ha2VzIHN1Y2ggYWNjdXJhdGUgcHJlZGljdGlvbnMuIEEgcHJpbWUgZXhhbXBsZSBvZiB0aGlzIGNyaXRpcXVlIGNhbiBiZSBzZWVuIGluIEFydGlmaWNpYWwgTmV1cmFsIE5ldHdvcmtzIChBTk4pIG1hY2hpbmVzLCB3aGljaCBvZnRlbiB1c2UgYSBsYXJnZSBudW1iZXIgb2Ygc21hbGwgbm9kZXMgdG8gc2VxdWVudGlhbGx5IGdlbmVyYXRlIGEgc2luZ2xlIHByZWRpY3Rpb24gd2l0aG91dCBhbnkgb25lIG9mIHRoZXNlIG5vZGVzIGhvbGRpbmcgYSBjbGVhciBpbnRlcnByZXRhdGlvbiBhcyB0byB3aGljaCB2YXJpYWJsZXMsIG9yIGNvbWJpbmF0aW9uIG9mIHZhcmlhYmxlcywgbGVhZCB0byBhIHBhcnRpY3VsYXIgaW1wcm92ZW1lbnQgaW4gcHJlZGljdGlvbi4gSG93ZXZlciwgYXMgTUwgbWV0aG9kcyBiZWNvbWUgbW9yZSBjb21tb25seSB1c2VkLCB0aGUgZGVtYW5kIGZvciBpbnRlcnByZXRhdGlvbiBvZiB0aGVzZSBtb2RlbHMgaGFzIGRyaXZlbiBzZXZlcmFsIHVzZWZ1bCBpbnRlcnByZXRhdGlvbiBtZXRob2RzIGFjcm9zcyBmb3IgYSB2YXJpZXR5IG9mIG1vZGVscy4gVGhlc2UgbWV0aG9kcyBpbmNsdWRlIGludGVycHJldGF0aW9uIGZvciBhIHNpbmdsZSBwcmVkaWN0aW9uLCBzdWNoIGFzIHRoZSBMb2NhbCBJbnRlcnByZXRhYmxlIE1vZGVsLWFnbm9zdGljIEV4cGxhbmF0aW9ucyAoTElNRSksIGFzIHdlbGwgYXMgZ2VuZXJhbGl6ZWQgbWV0aG9kcyBvZiBtZWFzdXJpbmcgcmVsYXRpdmUgZmVhdHVyZSBpbXBvcnRhbmNlLCB3aGljaCB1c2VzIHZhcmlvdXMgdGVjaG5pcXVlcyB0byBkZXRlcm1pbmUgdGhlIGF2ZXJhZ2UgY29udHJpYnV0aW9uIG9mIGVhY2ggdmFyaWFibGUgdG8gdGhlIG1vZGVsJ3MgYWJpbGl0eSB0byBkZWNyZWFzZSBpdHMgdGVzdCBNU0UgcmF0ZS4gCgoKT2YgdGhlIG1vZGVscyBzYW1wbGVkLCB0aGUgZVh0cmVtZSBHcmFkaWVudCBCb29zdGluZyBNYWNoaW5lLCBhbHNvIHJlZmVycmVkIHRvIGFzIFhHQm9vc3QsIG91dHBlcmZvcm1zIHRoZSBvdGhlciBtb2RlbHMgYm90aCBpbiB0ZXJtcyBvZiBoYXZpbmcgdGhlIGxvd2VzdCB0ZXN0IE1TRSBhbmQgaGF2aW5nIHRoZSBiZXN0IG1ldGhvZHMgZm9yIGRldGFpbGVkIHZhcmlhYmxlIGludGVycHJldGF0aW9uLiBGb3IgdGhpcyByZWFzb24sIFhHQm9vc3QgaXMgY2hvc2VuIGFzIHRoZSBwcmltYXJ5IE1MIG1vZGVsIGZvciB0aGlzIHRoZXNpcyAKCgo8YnI+CgojIyMjIyA0LjQuNSBlWHRyZW1lIEdyYWRpZW50IEJvb3N0aW5nIE1hY2hpbmUgQWxnb3JpdGhtCkluIG9yZGVyIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIG9mIFhHQm9vc3QsIG9uZSBtdXN0IGZpcnN0IGxvb2sgYXQgdGhlIGNvbXBhY3QsIHlldCBwb3dlcmZ1bCBhbGdvcml0aG0gYmVoaW5kIGl0cyBjb21wdXRhdGlvbi4gSW4gdGhpcyBzZWN0aW9uLCBJIHdpbGwgbGF5IG91dCB0aGUgbWF0aGVtYXRpY2FsIGZvcm11bGF0aW9uIG9mIHRoZSBpbnB1dCwgY29yZSBhbGdvcml0aG0sIGFuZCBmaW5hbCBvdXRwdXQgb2YgdGhlIFhHQm9vc3QgbWFjaGluZS4KCjxicj4KCjEuIEFsZ29yaXRobSBpbnB1dDogV2Ugc3RhcnQgd2l0aCBhIHRyYWluaW5nIHNldCAke1xkaXNwbGF5c3R5bGUgXHsoeF97aX0seV97aX0pXH1fe2k9MX1ee059fSQsIGEgZGlmZmVyZW50aWFibGUgbG9zcyBmdW5jdGlvbiAkTCh5LCBGKHgpKSQsIGEgbnVtYmVyIG9mIHdlYWsgbGVhcm5lcnMgKHNoYWxsb3cgdHJlZXMpICRNJCwgYW5kIGEgbGVhcm5pbmcgcmF0ZSAkXGFscGhhJC4KCgoyLiBBbGdvcml0aG06CgoyLjEgSW5pdGlhbGl6ZSBtb2RlbCB3aXRoIGEgY29uc3RhbnQgdmFsdWU6CgokJHtcZGlzcGxheXN0eWxlIHtcaGF0IHtmfX1feygwKX0oeCk9e1x1bmRlcnNldCB7XHRoZXRhIH17XGFyZyBcbWluIH19XHN1bSBfe2k9MX1ee059TCh5X3tpfSxcdGhldGEgKX0kJAoKPGJyPgoKMi4yIEZvciAkbSA9IDEkIHRvICRNJDoKCjIuMi4xIENvbXB1dGUgdGhlICdncmFkaWVudHMnIGFuZCAnaGVzc2lhbnMKJCR7XGRpc3BsYXlzdHlsZSB7XGhhdCB7Z319X3ttfSh4X3tpfSk9XGxlZnRbe1xmcmFjIHtccGFydGlhbCBMKHlfe2l9LGYoeF97aX0pKX17XHBhcnRpYWwgZih4X3tpfSl9fVxyaWdodF1fe2YoeCk9e1xoYXQge2Z9fV97KG0tMSl9KHgpfX0kJAokJHtcZGlzcGxheXN0eWxlIHtcaGF0IHtofX1fe219KHhfe2l9KT1cbGVmdFt7XGZyYWMge1xwYXJ0aWFsIF57Mn1MKHlfe2l9LGYoeF97aX0pKX17XHBhcnRpYWwgZih4X3tpfSleezJ9fX1ccmlnaHRdX3tmKHgpPXtcaGF0IHtmfX1feyhtLTEpfSh4KX19JCQKCjxicj4KCjIuMi4yIEZpdCBhbiBvcmlnaW5hbCB3ZWFrIGxlYXJuZXIgKGUuZy4gc2hhbGxvdyB0cmVlKSB1c2luZyB0aGUgdHJhaW5pbmcgc2V0ICR7XGRpc3BsYXlzdHlsZSBce3hfe2l9LC17XGZyYWMge3tcaGF0IHtnfX1fe219KHhfe2l9KX17e1xoYXQge2h9fV97bX0oeF97aX0pfX1cfV97aT0xfV57Tn19JCBieSBzb2x2aW5nIHRoZSBmb2xsb3dpbmcgb3B0aW1pemF0aW9uIHByb2JsZW06CgokJHtcZGlzcGxheXN0eWxlIHtcaGF0IHtccGhpIH19X3ttfT17XHVuZGVyc2V0IHtccGhpIFxpbiBcbWF0aGJmIHtcUGhpIH0gfXtcYXJnIFxtaW4gfX1cc3VtIF97aT0xfV57Tn17XGZyYWMgezF9ezJ9fXtcaGF0IHtofX1fe219KHhfe2l9KVxsZWZ0Wy17XGZyYWMge3tcaGF0IHtnfX1fe219KHhfe2l9KX17e1xoYXQge2h9fV97bX0oeF97aX0pfX0tXHBoaSAoeF97aX0pXHJpZ2h0XV57Mn19JCQKCiQke1xkaXNwbGF5c3R5bGUge1xoYXQge2Z9fV97bX0oeCk9XGFscGhhIHtcaGF0IHtccGhpIH19X3ttfSh4KS59JCQKCjxicj4KCjIuMyBVcGRhdGUgdGhlIG1vZGVsOgokJHtcZGlzcGxheXN0eWxlIHtcaGF0IHtmfX1feyhtKX0oeCk9e1xoYXQge2Z9fV97KG0tMSl9KHgpK3tcaGF0IHtmfX1fe219KHgpLn0kJAoKPGJyPgoKMy4gQWxnb3JpdGhtIE91dHB1dDogCiQke1xkaXNwbGF5c3R5bGUge1xoYXQge2Z9fSh4KT17XGhhdCB7Zn19X3soTSl9KHgpPVxzdW0gX3ttPTB9XntNfXtcaGF0IHtmfX1fe219KHgpfSQkCgo8YnI+CgojIyMjIyA0LjQuNiBYR0Jvb3N0IE1vZGVsIEZpdHRpbmcgYW5kIEh5cGVycGFyYW1ldGVyIFR1bmluZwpJbiBwcmFjdGljZSwgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2R1Y2UgdGhlIG1vc3Qgb3B0aW1hbCByZXN1bHRzIGZyb20gYW4gWEdCb29zdCBtYWNoaW5lLCBhcyBpcyB0cnVlIHdpdGggbW9zdCBvdGhlciBNTCBtb2RlbHMsIG9uZSBtdXN0IGZpcnN0IHRyYW5zZm9ybSB0aGUgZGF0YSBzZXQgaW50byBhbiBvcHRpbWFsIGZvcm0gYW5kIHRoZW4gcnVuIHNldCBvZiBoeXBlcnBhcmFtZXRlciB0ZXN0cyB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGxldmVsIGZvciBlYWNoIG9mIHRoZSBtb2RlbCdzIGJhc2ljIHN0cnVjdHVyYWwgcnVsZXMgKGkuZS4gaHlwZXJwYXJhbWV0ZXJzKS4KClNpbmNlIHRoZSBYR0Jvb3N0IG1hY2hpbmUgcmVxdWlyZXMgb25seSBudW1lcmljYWwgZGF0YSwgZmFjdG9yIGRhdGEgbXVzdCBiZSBjb252ZXJ0ZWQgaW50byBudW1lcmljYWwgbGV2ZWxzIHdoaWNoIGNhbiBiZSB0aGUgdXNlZCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIGRlY2lzaW9uIHRyZWVzLiBUbyBhY2NvbXBsaXNoIHRoaXMgd2l0aCB0aGUgYWRkZWQgY29tcGxleGl0eSBvZiBzb21lIGZhY3RvciB2YXJpYWJsZXMgaGF2aW5nIG1vcmUgdGhhbiB0d28gbGV2ZWxzLCBJIGhhdmUgdXNlZCBhIG1ldGhvZCBjYWxsZWQgKk9uZS1Ib3QgRW5jb2RpbmcqLCB3aGljaCBlbmNvZGVzIGVhY2ggaW5kaXZpZHVhbCBmYWN0b3IgdmFyaWFibGUgbGV2ZWwgaW50byBhIHZlY3RvciBjb250YWluaW5nICcxJyBpZiB0aGF0IGZhY3RvciBhbmQgbGV2ZWwgYXJlIHByZXNlbnQsIGFuZCAnMCcgaWYgaXQgaXMgbm90LiBJbiB0aGlzIHdheSwgdGhlIGRhdGFmcmFtZSBpcyBjb252ZXJ0ZWQgaW50byBhIGxhcmdlIG1hdHJpeCBvZiBjb250aW51b3VzIGFuZCBiaW5hcnkgY29sdW1ucy4KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L09uZV9ob3RfdGFibGUucG5nKXt3aWR0aD05MCV9CjwvY2VudGVyPgoKPGJyPgoKT25jZSB0aGUgbW9kZWwgaXMgZml0dGVkIHRvIHRoZSBkYXRhLCB0aGUgbmV4dCBwcm9jZWR1cmUgaXMgdG8gdHVuZSB0aGUgaHlwZXJwYXJhbWV0ZXJzIHdoaWNoIGdvdmVybiB0aGUgYWxnb3JpdGhtJ3MgbGVhcm5pbmcgcHJvY2VzcyBhbmQgdGhlcmVmb3JlIGRldGVybWluZSB0aGUgcmVzdWx0aW5nIHZhbHVlcyBvZiBlc3RpbWF0ZWQgcGFyYW1ldGVycy4gVG8gZG8gdGhpcywgYSBsYXJnZSBncmlkIG9mIGh5cGVycGFyYW1ldGVycyBpcyBjcmVhdGVkIGFuZCB0aGVuIGFuIGluZGl2aWR1YWwgbW9kZWwgY29udGFpbmluZyBlYWNoIHVuaXF1ZSBjb21iaW5hdGlvbiBvZiBoeXBlcnBhcmFtZXRlciBsZXZlbHMgaXMgZ2VuZXJhdGVkIGFuZCB0aGVpciByZXN1bHRpbmcgdGVzdCBNU0UncyBhcmUgcmFua2VkIGFuZCBhbmFseXplZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGxhcmdlIGdyaWQgc2VhcmNoIGRldGVybWluZSB3aGljaCBjb21iaW5hdGlvbiBvZiBoeXBlcnBhcmFtZXRlcnMgYXJlIG9wdGltYWwsIGFuZCB0aG9zZSBoeXBlcnBhcmFtZXRlcnMgYXJlIHVzZWQgaW4gdGhlIGZpbmFsIG1vZGVsLiBUaGUgc2VhcmNoIGdyaWQgZnJvbSB0aGlzIHJlc2VhcmNoIHdhcyBzbyBsYXJnZSwgaXQgdG9vayBteSBjb21wdXRlciAqNzggaG91cnMqIHRvIGNvbXBsZXRlIGFsbCBvZiB0aGUgY2FsY3VsYXRpb24gbmVjZXNzYXJ5IGZvciB0aGUgZnVsbCB0dW5pbmcgcHJvY2Vzcy4KCjxicj4KCiMjIyMjIDQuNC43IFhHQm9vc3QgUGFydGlhbCBEZXBlbmRlbmN5IFBsb3RzCgpQYXJ0aWFsIGRlcGVuZGVuY3kgcGxvdHMgKFBEUCkgc2hvd3MgcmVsYXRpb25zaGlwLCBvciBkZXBlbmRlbmNlLCBiZXR3ZWVuIHRoZSBtb2RlbCdzIHJlc3BvbnNlIHZhcmlhYmxlIChpLmUuICRzb2xkIFwgcHJpY2UkKSBhbmQgYSBjaG9zZW4gdmFyaWFibGUsIG9yIHNldCBvZiB2YXJpYWJsZXMsIG9mIGludGVyZXN0cyAoVm9JKSwgcmVzdWx0aW5nIGluIHRoZSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgYSB2YXJpYWJsZXMgbWFyZ2luYWwgY29udHJpYnV0aW9uIHRvIHRoZSBtYWNoaW5lJ3MgcHJlZGljdGlvbiBhY3Jvc3MgdGhlIHZhcmlhYmxlIG9mIGludGVyZXN0J3MgZW50aXJlIHJhbmdlLiBJbiBvcmRlciB0byBhbmFseXplIHRoZSByZXN1bHRzIG9mIHRoZSBYR0Jvb3N0IG1hY2hpbmUgYXQgdGhlIHZhcmlhYmxlLWJ5LXZhcmlhYmxlIGxldmVsLCBJIGhhdmUgZ2VuZXJhdGUgYSBwYW5lbCBvZiBmb3VyIGdyYXBoaWNhbCBwYXJ0aWFsIGRlcGVuZGVuY3kgcGxvdHMgZm9yIGVhY2ggdmFyaWFibGUgb2YgaW50ZXJlc3QuIFRoZXNpcyB3aWxsIGJlIHRoZSBmb2xsb3dpbmc6IEJhc2ljIFBEUCBwbG90LCBJbmRpdmlkdWFsIENvbmRpdGlvbmFsIEV4cGVjdGF0aW9uIChJQ0UpIHBsb3RzLCBQRFAgaGVhdG1hcCB3aXRoIFZvSSBhZ2FpbnN0IGNvcm9uYSBpbmZlY3Rpb24sIDMtZGltZW5zaW9uYWwgUERQIGhlYXRtYXAgd2l0aCBWb0kgYWdhaW5zdCBjb3JvbmEgaW5mZWN0aW9uLiBBbiBleGFtcGxlIG9mIGVhY2ggb2YgdGhlc2UgZ3JhcGhzLCB1c2luZyBkYXlzIG9uIG1hcmtldCBhcyB0aGUgdmFyaWFibGUgb2YgZm9jdXMsIGNhbiBiZSBzZWVuIGluIHF1YWRyYW50cyBJViwgSSwgSUlJLCBhbmQgSUkgcmVzcGVjdGl2ZWx5LgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUERQX0V4YW1wbGVfQ29tYmluZWQucG5nKXt3aWR0aD05OSV9CjwvY2VudGVyPgoKPGJyPgoKPGJyPjxicj4KCiMjIyA1LiBIeXBvdGhlc2lzIENvbnN0cnVjdGlvbgoKIyMjIyA1LjEgQ292aWQtMTk6IEdlbmVyYWwgQ2FzZQo+ICoqSHlwb3RoZXNpcyBJOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgc2lnbmlmaWNhbnRseSBpbmNyZWFzZWQgaG91c2luZyBwcmljZXMKPgo+ICoqUmVhc29uaW5nOioqIEFzIG1hbnkgd29ya2VycyBoYXZlIHBlcm1pbmFudGx5IHNoaWZ0ZWQgdG8gcmVtb3RlIHdvcmssIHRoZSB0b3RhbCB1dGlsaXR5IG9mIHJlc2lkZW50aWFsIGhvdXNpbmcgaGFzIGluY3JlYXNlZCwgdGhlcmVieSBpbmNyZWFzaW5nIHRoZSBwcmljZSBob3VzZWhvbGRzIGFyZSB3aWxsaW5nIHRvIHBheS4gVGhpcyBwcmljZSBzaGlmdCBjYW4gYmUgZXhwbGFpbmVkIHRocm91Z2ggbWVhc3VyaW5nIHRoZSBjaGFuZ2VzIGlmIHJlbGF0aXZlIGRlbWFuZCBmb3Igc3BlY2lmaWMgaGVkb25pYyBmZWF0dXJlcywgc3VjaCBhcyBiZWRyb29tcywgc2l6ZSwgYWdlLCBhbmQgb3RoZXJzLiAKCjxicj4KCiMjIyMgNS4yIENvdmlkLTE5OiBQcmVtaXVtIGZvciBCZWRyb29tcwo+ICoqSHlwb3RoZXNpcyBJSToqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGRlbWFuZC1wcmVtaXVtcyBmb3IgZXZlcnkgbGV2ZWwgb2YgbnVtYmVyIG9mIGJlZHJvb21zIGdyZWF0ZXIgdGhhbiAxIAo+Cj4gKipSZWFzb25pbmc6KiogQXMgbWFueSB3b3JrZXJzIGhhdmUgcGVybWluYW50bHkgc2hpZnRlZCB0byByZW1vdGUgd29yaywgdGhlIHByZW1pdW0gZm9yIGFuIGFkZGl0aW9uYWwgYmVkcm9vbSBpcyBleHBlY3RlZCB0byBpbmNyZWFzZSBhY3Jvc3MgZWFjaCBsZXZlbCBvZiB0b3RhbCBudW1iZXIgb2YgYmVkcm9vbXMgYXMgaG91c2Vob2xkcyBuZWVkIGFkZGl0aW9uYWwgcm9vbXMgZm9yIGhvbWVvZmZpY2VzIGFuZCBvdGhlciBhY3Rpdml0aWVzLiBUaGUgcHJlbWl1bSBmb3IgYSBzaW5nbGUgYmVkcm9vbSBpcyBleHBlY3RlZCB0byBiZSBpbnNpZ25pZmljYW50IHNpbmNlIHRoZXJlIGFyZSBubyByZWNvcmRlZCAwLWJlZHJvb20gaG91c2VzIHRvIHVwZ3JhZGUgZnJvbS4KCjxicj4KCiMjIyMgNS4zIENvdmlkLTE5OiBQcmVtaXVtIGZvciBDaXR5IENlbnRyYWxpdHkKPiAqKkh5cG90aGVzaXMgSUlJOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgaW1wYWN0ZWQgcHJvcGVydGllcyB3aXRoaW4gY2l0eSBsaW1pdHMgbW9yZSB0aGFuIHRob3NlIG5vdCB3aXRoaW4gY2l0eSBsaW1pdHMgIAo+Cj4gKipSZWFzb25pbmc6KiogQXMgd29ya2VycyB3aG8gbGl2ZSBpbiBjaXR5IGxpbWl0cyBhcmUgZXhwZWN0ZWQgdG8gaG9sZCBqb2JzIG1vcmUgbGlrZWx5IHRvIGJlIGNvbXBhdGVibGUgd2l0aCByZW1vdGUgd29yaywgc3VjaCBhcyBqb2JzIHdpdGhpbiB0aGUgZmluYW5jaWFsIGluZHVzdHJ5LCBob21lIHByaWNlcyB3aXRoaW4gY2l0eSBsaW1pdHMgYXJlIGRpc3Byb3BvcnNpb25hdGx5IGltcGFjdGVkIGJ5IHRoZSBzaGlmdCB0byByZW1vdGUgd29yay4KCjxicj4KCiMjIyMgNS40IENvdmlkLTE5OiBQcmVtaXVtIGZvciBTaXplCgo+ICoqSHlwb3RoZXNpcyBJVjoqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIGluY3JlYXNlZCB0aGUgcHJlbWl1bSBmb3IgcHJvcGVydHkgc2l6ZSAKPgo+ICoqUmVhc29uaW5nOioqIFNhbWUgYXMgZm9yIGh5cG90aGVzaXMgSQoKPGJyPgoKPiAqKkh5cG90aGVzaXMgVjoqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIGltcGFjdGVkIHByb3BlcnRpZXMgaW4gdGhlIHRvcCAyNXRoIHBlcmNlbnRpbGUgb2YgcHJvcGVydHkgc2l6ZSBtb3JlIHRoYW4gdGhlIGJvdHRvbSAyNXRoIHBlcmNlbnRpbGUgCj4KPiAqKlJlYXNvbmluZzoqKiBIb3VzZWhvbGRzIHdobyBsaXZlIGluIHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIGhvbWUgc2l6ZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGhvbGQgd2hpdGUtY29sbGFyIGpvYnMsIHdoaWNoIGFyZSBtb3JlIGxpa2VseSB0byBiZSBtYWRlIHJlbW90ZSwgd2hpY2ggaW5jcmVhc2VzIHRoZSBwcmVtaXVtIHRoZXkgYXJlIHdpbGxpbmcgdG8gcGF5IGZvciBhZGRpdG9uYWwgaGVkb25pYyBmZWF0dXJlcy4KCjxicj4KCiMjIyMgNS41IENvdmlkLTE5OiBQcmVtaXVtIGZvciBBZ2UgCgo+ICoqSHlwb3RoZXNpcyBWSToqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIGRlY3JlYXNlZCB0aGUgcHJlbWl1bSBmb3IgcHJvcGVydHkgYWdlIAo+Cj4gKipSZWFzb25pbmc6KiogQXMgdGhlIHZvbG9jaXR5IG9mIGhvbWUgc2FsZXMgaW5jcmVhc2UsIHRoZSBnZW5lcmFsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHByb3BlcnR5IGFnZSBhbmQgcHJpY2UgaXMgZXhwZWN0ZWQgdG8gYmUgZXhhc3RlcmJhdGVkIGFzIHRob3NlIHVwZ3JhZGluZyBob3VzZXMgd2lsbCBzaGl0IHRvd2FyZHMgbmV3ZXIgcHJvcGVydGllcwoKPGJyPgoKPiAqKkh5cG90aGVzaXMgVklJOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgaW1wYWN0ZWQgcHJvcGVydGllcyBpbiB0aGUgdG9wIDI1dGggcGVyY2VudGlsZSBvZiBhZ2UgbW9yZSB0aGFuIHRoZSBib3R0b20gMjV0aCBwZXJjZW50aWxlICAKPgo+ICoqUmVhc29uaW5nOioqIFRoZSBwcmVtaXVtIGZvciB0aGUgeW91bmdlc3QgKGkuZS4gbmV3ZXN0KSBwcm9wZXJ0aWVzIGlzIGV4cGVjdGVkIHRvIGluY3JlYXNlIHdoaWxlIHRoZSBwcmVtaXVtIGZvciB0aGUgb2xkZXN0IHByb3BlcnRpZXMgaXMgZXhwZWN0ZWQgdG8gZGVjcmVhc2UuIEFzIHRoZSBtYXJrZXQgc2hpZnRzIHRvd2FyZHMgbmV3ZXIgcHJvcGVydGllcywgdGhleSBtdXN0IG5lY2lzc2FyaWx5IHNoaWZ0IGF3YXkgZnJvbSBvbGRlciBwcm9wZXJ0aWVzLgoKPGJyPgoKIyMjIyA1LjYgQ292aWQtMTk6IENoYW5nZSBpbiBEYXlzIG9uIE1hcmtldAoKPiAqKkh5cG90aGVzaXMgVklJSToqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIHNpZ25pZmljYW50bHkgZGVjcmVhc2VkIHRoZSBwcmVtaXVtIGZvciBkYXlzIG9uIG1hcmtldCAKPgo+ICoqUmVhc29uaW5nOioqIEFzIHRoZSB2b2xvY2l0eSBvZiBob21lIHNhbGVzIGluY3JlYXNlLCBtb3JlIGhvbWVzIGFyZSBzb2xkIGZhc3RlciwgYW5kIHRoZXJlZm9yZSB0aGUgbnVtYmVyIG9mIGRheXMgb24gdGhlIG1hcmtldCBiZWNvbWVzIGxlc3Mgb2YgYSBwcmVkaWN0b3Igb2YgcXVhbGl0eSBzaW5jZSBldmVuIGxvd2VyIHF1YWxpdHkgYW5kIG92ZXItcHJpY2VkIGhvbWVzIGFyZSBzb2xkIG1vcmUgcXVpY2tseS4gCgo8YnI+Cgo+ICoqSHlwb3RoZXNpcyBJWDoqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIGltcGFjdGVkIHByb3BlcnRpZXMgaW4gdGhlIHRvcCAyNXRoIHBlcmNlbnRpbGUgb2YgZGF5cyBvbiBtYXJrZXQgbW9yZSB0aGFuIHRoZSBib3R0b20gMjV0aCBwZXJjZW50aWxlIAo+Cj4gKipSZWFzb25pbmc6KiogVGhlIHByZW1pdW0gZm9yIGEgcHJvcGVydHkgYmVpbmcgc29sZCB3aXRoaW4gdGhlIHRvcCAyNXRoIHBlcmNlbnRpbGUgb2YgZGF5cyBvbiBtYXJrZXQgKERPTSksIGkuZS4gdGhlIHByb3BlcnRpZXMgd2hpY2ggc2l0IG9uIHRoZSBtYXJrZXQgdGhlIGxvZ2VzdCwgaXMgZXhwZWN0ZWQgdG8gYmUgZGlzcHJvcG9ydGlvbmF0ZWx5IGVmZmVjdGVkIHdoZW4gY29tcGFyZWQgaG9tZXMgd2hpY2ggc29sZCB0aGUgZmFzdGVzdCwgYXMgaG91c2Vob2xkcyBlbGFzdGljaXR5IG9mIGRlbWFuZCBmb3Igc3BlY2lmaWMgY2hhcmFjdGVyaXN0aWNzIGRlY3Jlc2VzIHJlbGF0aXZlIHRvIHByaWNlLCBpdCB3aWxsIHRha2UgbGFyZ2VyIGRldmlhdGlvbiBpbiBwcmljZSBhbmQgcXVhbGl0eSB0byBtYWtlIGEgaG9tZSBzZWxsIGluIHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIERPTSAKCgo8YnI+PGJyPgoKIyMjIDYuIFJlc3VsdHMKVGhpcyBzZWN0aW9uIHdpbGwgZm9sbG93IGEgY29uc2lzdGVudCBzdHJ1Y3R1cmUgZm9yIGVhY2ggc2V0IG9mIHJlc3VsdHMuIEVhY2ggaHlwb3RoZXNpcyB3aWxsIGhhdmU6IEEgKnN1bW1hcnkgb2YgdGhlIGZpbmRpbmcqOyAqZmVhdHVyZSByZXZpZXcqIG9mIHRoZSBjaGFyYWN0ZXJpc3RpYyBiZWluZyBtb2RlbGVkOyBhbmQgKm1vZGVsIHJlc3VsdHMqIGZyb20gdGhlIE9MUyBhbmQgTUwgbW9kZWxzIHdpdGggc3RhbmRhcmQgaHlwb3RoZXNpcyBjb25jbHVzaW9uKHMpLiAKCjxicj4KCiMjIyMgNi4xIENvdmlkLTE5OiBHZW5lcmFsIENhc2UKIyMjIyMgNi4xLjEgU3VtbWFyeSBvZiBGaW5kaW5ncwoKPiBQcmVsaW1pbmFyeSBhbmFseXNpcyBvZiBob3VzaW5nIHByaWNlcyBhbmQgZGFpbHkgaW5mZWN0aW9ucyByZXZlYWxzIGEgcG9zaXRpdmUgaGlzdG9yaWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28ga2V5IHZhcmlhYmxlcy4gVGhpcyByZWxhdGlvbnNoaXAgaXMgc3Ryb25nbHkgc3VwcG9ydGVkIGJ5IHRoZSBYR0Jvb3N0IE1MIGFsZ29yaXRobSwgd2hpY2ggc2hvd3MgdGhhdCBhIG1heGltYWwgcmVkdWN0aW9uIGluIHByZWRpY3Rpb25zIGVycm9yIGlzIGFjaGVpdmVkIGJ5IGluY3JlYXNpbmcgcHJlZGljaXRvbiBwcmljZSBhdCBhbGwgbGV2ZWxzIG9mIGRhaWx5IGluZmVjdGlvbnMgZ3JlYXRlciB0aGFuIDAsIGhvbGRpbmcgYWxsIG90aGVyIGZhY3RvcnMgY29uc3RhbnQuIFhHQm9vc3QgYWxzbyBkZXRlcm1pbmVkIHRoYXQgZnJvbSB0aGUgMTA0IHRvdGFsIHZhcmlhYmxlcyB1c2VkLCBkYWlseSBpbmZlY3Rpb25zIGlzIHRoZSAxOXRoIG1vc3QgaW1wb3J0YW50IHZhcmlhYmxlIGluIHJlZHVjaW5nIHByaWNlIHByZWRpY3Rpb24gZXJyb3IuICAKPgo+IEluIHRoZSBmdWxseSBjb250cm9sbGVkIEFscGhhIG1vZGVsLCB0aGUgYmV0YSBjb2VmZmljaWVudCBmb3IgZGFpbHkgaW5mZWN0aW9ucyBzdWdnZXN0cyB0aGF0IGVhY2ggYWRkaXRpb25hbCBpbmZlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGF2ZXJhZ2UgaG9tZSBwcmljZSAqaW5jcmVhc2Ugb2YgJDguOTcqLCBjZXRlcmlzIHBhcmFidXMuIFRoaXMgZmluZGluZyBpcyBzaWduaWZpY2FudCBhdCB0aGUgKnAgPCAwLjAwKiBsZXZlbC4gVGhlcmVmb3JlLCB3ZSByZWplY3QgJEhfMDogYmV0YV97aW5mZWN0aW9uc18zbW1hfSA9IDAkLiBJIGNvbmNsdWRlIHRoYXQgdGhlIENvdmlkLTE5IGNyaXNpcyBzaWduaWZpY2FudGx5IGluY3JlYXNlZCBob3VzaW5nIHByaWNlcyBIeXBvdGhlc2lzIEkpLgoKIyMjIyMgNi4xLjIgVmlzdWFsIFJldmlldwpXZSBmaXJzdCBsb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgZGFpbHkgaW5mZWN0aW9ucyBhbmQgdGhlIGFjY3VtdWxhdGlvbiBvZiBpbmZlY3Rpb25zIGFjcm9zcyB0aW1lLiBUaGUgdmFyaWF0aW9uIGluIGhpc3RvcmljYWwgZGFpbHkgaW5mZWN0aW9ucyBzaG91bGQgcHJvdmlkZSBhIHN0cm9uZyBtZWFzdXJlbWVudCBmb3IgZXhwbGFpbmluZyB2YXJpYXRpb25zIGluIHByaWNlIHJlbGF0ZWQgdG8gdGhpcyBrZXkgdmFyaWFibGUuIAoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Db3JvbmFfR2VuZXJhbC9JbmZlY3Rpb25zX2NvbWJpbmVkLnBuZyl7d2lkdGg9OTklfQo8L2NlbnRlcj4KCjxicj4KClRvIGludmVzdGlnYXRlIHRoZSByYXcgaGlzdG9yaWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmZlY3Rpb25zIHJhdGVzIGFuZCBwcmljZXMsIHdlIGxvb2sgYXQgdGhlIHRyZW5kIGxpbmUgb2YgcHJpY2UgdnMgZGFpbHkgaW5mZWN0aW9ucyAocmhzKSBhbmQgYSBjb21wYXJpc29uIGJldHdlZW4gdGhlIHByaWNlIGRpc3RyaWJ1dGlvbnMgb2YgcHJlIGFuZCBwb3N0LWluZmVjdGlvbnMgcGVyaW9kIChsaHMpLiBUaGVzZSBhbmFseXNpcyBzdWdnZXN0cyBhIGhpc3RvcmljYWxseSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmZlY3Rpb25zIGFuZCBwcmljZS4gVGhvdWdoIHRoZXNlIGdyYXBocyBhcmUgcHJvbWlzaW5nLCBpdCBpcyB1bmNsZWFyIGlmIG90aGVyIGZhY3RvcnMgY291bGQgYmUgaW5mbHVlbmNpbmcgdGhpcyByZWxhdGlvbnNoaXAuIFRvIGVzdGFibGlzaCBhIHN0YXRpc3RpY2FsIHJlbGF0aW9uc2hpcCwgd2UgdHVybiB0byB0aGUgZm9sbG93aW5nIE9MUyBhbmQgTUwgbW9kZWxzLiAgCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0Nvcm9uYV9HZW5lcmFsL0luZmVjdF9wcmljZV9jb21iby5wbmcpe3dpZHRoPTk5JX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjEuMyBPTFMgTW9kZWxpbmcKU2luY2UgZGlzcGxheWluZyB0aGUgZnVsbCBPTFMgb3V0cHV0IGZvciBldmVyeSBzZXQgb2YgcmVzdWx0cyBpcyBpbXByYWN0aWNhbCwgSSB3aWxsIGluY2x1ZGUgYSBzdW1tYXJpemVkIHZlcnNpb24gd2l0aCBvbmx5IHRoZSBrZXkgdmFyaWFibGVzIGluY2x1ZGVkLiBQbGVhc2Ugbm90ZSB0aGF0IGlmIHlvdSB3aXNoIHRvIHNlZSBlYWNoIHJlZ3Jlc3Npb24gb3V0cHV0IHRhYmxlLCBjb2RlLCBhbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0aGVzaXMsIHlvdSBjYW4gdmlzaXQgbXkgcHVibGljIEdpdEh1YiByZXBvc2l0b3J5IHdpdGggdGhlIGZvbGxvd2luZyBsaW5rOiBodHRwczovL2dpdGh1Yi5jb20vU2F3YmVuc29uMTUvSFBNX1RoZXNpcy4KCj4gSW4gdGhlIGZ1bGx5IGNvbnRyb2xsZWQgQWxwaGEgbW9kZWwsIHRoZSBiZXRhIGNvZWZmaWNpZW50IGZvciBkYWlseSBpbmZlY3Rpb25zIHN1Z2dlc3QgdGhhdCBlYWNoIGFkZGl0aW9uYWwgaW5mZWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhdmVyYWdlIGhvbWUgcHJpY2UgKmluY3JlYXNlIG9mICQ4Ljk3KiwgY2V0ZXJpcyBwYXJhYnVzLiBUaGlzIGZpbmRpbmcgaXMgc2lnbmlmaWNhbnQgYXQgdGhlICpwIDwgMC4wMCogbGV2ZWwuIEkgdGhlcmVmb3JlIHJlamVjdCB0aGUgJEhfMCQgb2YgSHlwb3RoZXNpcyBJLCBjb25jbHVkaW5nIHRoYXQgdGhlIENvdmlkLTE5IGNyaXNpcyBzaWduaWZpY2FudGx5IGluY3JlYXNlZCBob3VzaW5nIHByaWNlcy4gICAKClRoaXMgZm91bmRhdGlvbmFsIGZpbmRpbmcgbGF5cyB0aGUgZ3JvdW5kd29yayBmb3IgdGhlIGZvbGxvd2luZyByZXN1bHRzLCB3aGljaCBhdHRlbXB0IHRvIGV4cGxhaW4gdGhlIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGluZmVjdGlvbnMgYW5kIHByaWNlIGF0IHRoZSBsZXZlbCBvZiBpbmRpdmlkdWFsIGhlZG9uaWMgdmFyaWFibGVzLgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Db3JvbmFfR2VuZXJhbC9zdW1tYXJ5X09MUy5wbmcpe3dpZHRoPTQwJX0KPC9jZW50ZXI+Cgo8YnI+PGJyPgoKVGhlIGZvbGxvd2luZyBncmFwaGljIHNob3dzIHRoZSBoaXN0b3JpY2FsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGRhaWx5IGluZmVjdGlvbnMgYW5kIHNvbGQgcHJpY2Ugd2l0aCBhIDFTRCBlcnJvciBtYXJnaW4gYXQgYWxsIHBvaW50IChpbiBncmV5KSwgdGhlIGJlc3Qgc2luZ2xlLXZhcmlhYmxlIGZpdCAoaW4gZ3JlZW4pLCBhbmQgdGhlIEFscGhhIG1vZGVsJ3MgbWFyZ2luYWwgZml0IChpbiBibHVlKS4gV2Ugc2VlIHRoYXQgdGhlIG1hbnkgY29udHJvbHMgb2YgdGhlIEFscGhhIG1vZGVsIGZsYXR0ZW4gdGhlIGVzdGltYXRlZCBtYXJnaW5hbCBlZmZlY3Qgb2YgZWFjaCBhZGRpdGlvbmFsIGRhaWx5IGluZmVjdGlvbiBvbiBwcmljZSwgaG93ZXZlciwgdGhpcyByZWxhdGlvbnNoaWlwIHJlbWFpbnMgcG9zaXRpdmUgYW5kIHNpZ25pZmljYW50LCBhcyBwcmV2aW91c2x5IGVzdGFibGlzaGVkLiAgCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0Nvcm9uYV9HZW5lcmFsL0Nvcm9uYV9wcmljZV9PTFNGaXQucG5nKXt3aWR0aD01NSV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyMgNi4xLjQgTUwgTW9kZWxpbmcKVG8gZnVydGhlciB0ZXN0IHRoZSByZWxldmFuY2Ugb2YgY29yb25hIGluZmVjdGlvbnMgaW4gZGV0ZXJtaW5pbmcgcHJpY2VzLCB3ZSBsb29rIGF0IHRoaXMgdmFyaWFibGUncyByZWxhdGl2ZSByYW5raW5nIGJhc2VkIGl0J3MgYWJpbGl0eSB0byBpbXByb3ZlIG91dC1vZi1zYW1wbGUgcHJlZGljdGlvbnMgd2l0aGluIG91ciBYR2Jvb3N0IG1vZGVsLiBUaGUgbWVhc3VyZW1lbnQgdXNlZCBpcyBjYWxsZWQgVmFyaWFibGUgSW1wb3J0YW5jZSBhbmQgaXMgZGVmaW5lZCBieSBhIGNvbWJpbmF0aW9uIG9mIGdhaW4sIGNvdmVyLCBhbmQgZnJlcXVlbmN5LiBHYWluIGlzIGhvdyBtdWNoIHByZWRpY3Rpb24gcG93ZXIgaXMgZ2FpbmVkIHdoZW4gdGhlIHZhcmlhYmxlIGlzIGFkZGVkIHRvIHRoZSBtb2RlbDsgY292ZXIgaXMgaG93IGhlYXZpbHkgdGhlIHZhcmlhYmxlIGlzIHdlaWdodGVkIGluIGVhY2ggaXRlcmF0aW9uLCBhbmQgZnJlcXVlbmN5IGlzIGhvdyBmcmVxdWVudGx5IHRoZSB2YXJpYWJsZSBhcHBlYXJzIGFjcm9zcyBhbGwgaXRlcmF0aW9ucy4gCgpXZSBzZWUgdGhhdCBvZiB0aGUgMTA0IHVuaXF1ZSB2YXJpYWJsZXMgb2ZmZXJlZCB0byB0aGUgWEdCb29zdCBtYWNoaW5lLCB0aGUgMy1tb250aCBtb3ZpbmcgYXZlcmFnZSBvZiBpbmZlY3Rpb24gd2FzIHRoZSAxOXRoIG1vc3QgZGVzY3JpcHRpdmUgdmFyaWFibGUgaW4gcHJlZGljdGluZyBwcmljZXMuIEkgY29uc2lkZXIgdGhpcyByZXN1bHRzIG5vbi10cml2aWFsIGFuZCBhIHZlcnkgc3Ryb25nIGNvbmZpcm1hdGlvbiB0aGF0IHRoZSByZWxhdGlvbnNoaXAgZm91bmQgaW4gdGhlIE9MUyBtb2RlbCBpcyBjb3JyZWN0LiAKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ29yb25hX0dlbmVyYWwvVmFyX0ltcG9ydGFuY2UucG5nKXt3aWR0aD05MCV9CjwvY2VudGVyPgoKVG8gZ2V0IGEgZGV0YWlsZWQgdW5kZXJzdGFuZGluZyBvZiB0aGUgbWFyZ2luYWwgZWZmZWN0IGVhY2ggYWRkaXRpb25hbCBkYWlseSBpbmZlY3Rpb24gaGFzIG9uIHByaWNlIHRocm91Z2gsIHdlIGxvb2sgYXQgdGhlIFBEUCBhbmQgdGhlIElDRSBvZiBpbmZlY3Rpb25zIGFuZCBwcmljZS4gVGhlIFBEUCAodG9wKSBzaG93cyB0aGUgb3B0aW1hbCBwcmljZSBjaGFuZ2Ugdy5yLnQuIGRhaWx5IGluZmVjdGlvbnMgd2hpY2ggbWluaW1pemUgdGhlIG1vZGVsJ3MgdGVzdCBNU0UuIFRoZSBJQ0UgKGJvdHRvbSkgaXMgdGhlIGluZGl2aWR1YWwgUERQIGZvciBldmVyeSBvYnNlcnZhdGlvbiBpbiB0aGUgZGF0YXNldCwgY2VudGVyZWQgYXQgaW5mZWN0aW9uID0gMC4gVGhlIElDRSBhbGxvd3MgdXMgdG8gdW5kZXJzdGFuZCB0aGUgc2ltcGxlIFBEUCwgd2hpY2ggaXMgYW4gZXZlcmFnZSBvZiB0aGUgaW5kaXZpZHVhbCBJQ0VzLCBpbiBtb3JlIGRldGFpbCBhbmQgYWxzbyB0byBwaWNrIHVwIG9uIGFueSBzaWducyBvZiBoZXRlcm9za2VkYXN0aWNpdHkgYW1vbmcgdGhlIGluZGl2aWR1YWwgc2FtcGxlIHByZWRpY3Rpb25zLiAKClRoZSBQRFAgc2hvd3MgdGhhdCBvbiBhdmVyYWdlLCBhbiBpbmNyZWFzZSBpbiBwcmljZSBhdCBldmVyeSBsZXZlbCBvZiBkYWlseSBpbmZlY3Rpb25zID4gMCByZWR1Y2VzIHRlc3QgTVNFLiBGdXJ0aGVybW9yZSwgdGhpcyB0cmVuZCBpcyBnZW5lcmFsbHkgdXB3YXJkIHRyZW5kaW5nLCB3aXRoIGEgbm90YWJsZSByYW5nZSBvZiByZXNwb25zZSBiZXR3ZWVuIDEsODAwIGFuZCAyLDUwMCBpbmZlY3Rpb25zLCB3aGljaCBJIHJlZmVyIHRvIGFzIHRoZSAqaW5mZWN0aW9uLXByaWNlIHJpZGdlLiogRGlzY3Vzc2lvbnMgcmVnYXJkaW5nIHBvc3NpYmxlIGV4cGxhbmF0aW9ucyBmb3IgdGhlIGdlbmVyYWwgc2hhcGUgb2YgdGhpcyByZWdpb24gd2lsbCBiZSBleHBsb3JlZCBpbiBzZWN0aW9uIDcuICAgICAKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ29yb25hX0dlbmVyYWwvUERQX0lDRV9nZW5lcmFsLnBuZyl7d2lkdGg9ODAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMgNi4yIENvdmlkLTE5OiBQcmVtaXVtIGZvciBCZWRyb29tcwoqRm9yZXdvcmQgZm9yIHRoaXMgc2VjdGlvbjoqCgpUaGVyZSBhcmUgdHdvIGNvbnRleHR1YWwgZGV0YWlscyB3aGljaCBtdXN0IGJlIGNvbnNpZGVyZWQgZm9yIG9uZSB0byBhcHByb3ByaWF0ZWx5IGludGVycHJldCB0aGUgZm9sbG93aW5nIGZpbmRpbmdzLiBGaXJzdCwgdGhlIHZhcmlhYmxlcyBmb3IgdG90YWwgbnVtYmVyIGJlZHJvb21zIGFuZCB0aGUgdG90YWwgbGl2aW5nIGFyZWEgb2YgYSBob21lIGFyZSBoaWdobHkgY29ycmVsYXRlZCwgYW5kIHRoZXJlZm9yZSB3aGVuIHRvdGFsIGxpdmluZyBhcmVhIGlzIGluY2x1ZGVkIGluIHRoZSBPTFMgbW9kZWwsIHRoZSBiZXRhIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBsZXZlbCBvZiBudW1iZXIgb2YgYmVkcm9vbXMgcmVwcmVzZW50cyB0aGUgcHJlbWl1bSBob21lb3duZXJzIGFyZSB3aWxsaW5nIHRvIHBheSBmb3IgdGhlIGFjdHVhbCBmZWF0dXJlIG9mIGFuIGV4dHJhIGJlZHJvb20gYXQgYSBmaXhlZCBsaXZpbmcgYXJlYSwgYW5kIG5vdCB0aGUgZXh0cmEgbGl2aW5nIGFyZWEgaXRzZWxmLiBBcyB0aGlzIHJlc3VsdHMgaW4gY29udm9sdXRlZCByZXN1bHRzLCBsaXZpbmcgYXJlYSBpcyBleGNsdWRlZCB3aGVuIHRlc3RpbmcgdGhlIGVmZmVjdCBvZiBiZWRyb29tcy4gVGhpcyBlZmZlY3RpdmVseSBtZWFzdXJlcyB0aGUgYWRkaXRpb25hbCByb29tIGFuZCB0aGUgYXZlcmFnZSBhZGRpdGlvbmFsIGxpdmluZyBhcmVhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGFkZGl0aW9uYWwgcm9vbSBhdCBlYWNoIGxldmVsIChlLmcuIGZyb20gMSBiZWRyb29tIHRvIDIsIDIgdG8gMywgZXRjLikuIFNlY29uZGx5LCB0aGUgT0xTIHJlc3VsdHMgbGlzdGVkIGJlbG93IHJlcHJlc2VudCB0aGUgY2hhbmdlIGluIHRoZSBwcmVtaXVtcyAoaS5lLiBiZXRhIGNvZWZmaWNpZW50cykgZnJvbSBwb3N0IHZzLiBwcmUgY29yb25hIGFuZCBub3QgdGhlIGFic29sdXRlIHByaWNlIHByZW1pdW1zLCBhcyBpbiB0aGUgY2FzZSBvZiBtZWFzdXJpbmcgZGFpbHkgaW5mZWN0aW9uIGFsb25lLiAKCiMjIyMjIDYuMi4xIFN1bW1hcnkgb2YgRmluZGluZ3MKCk5vdGU6IGFkZCB4Z2Jvb3N0IHJlc3VsdHMKCj4gUHJlbGltaWxhcnkgZmluZGluZ3Mgc2hvdyB0aGF0IHRoZSBwcmljZSBkaXN0cmlidXRpb24gZm9yIGV2ZXJ5IGxldmVsIG9mIG51bWJlciBvZiBiZWRyb29tcyBpbmNyZWFzZWQgYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5mZWN0aW9uIHBlcmlvZCAoaS5lLiBhY2N1bXVsYXRpb24gb2YgaW5mZWN0aW9ucyA+PSAxMDAwKSwgYXMgcHJlZGljdGVkLiBUaGUgYXZlcmFnZSBudW1iZXIgb2YgdG90YWwgYmVkcm9vbXMgYmV0d2VlbiBwcmUgYW5kIHBvc3QtaW5mZWN0aW9ucyBwZXJpb2QgZGV2aWF0ZSBzbGlnaHRseSwgd2l0aCBwb3N0LWluZmVjdGlvbnMgcGVyaW9kIGJlaW5nIDAuMDAzIGhpZ2hlci4gSG93ZXZlciwgdGhlIGtleSBmb2N1cyBvZiB0aGlzIHNlY3Rpb24gaXMgbm90IGFic29sdXRlIGNoYW5nZXMgaW4gdGhlIGZlYXR1cmUgKm51bWJlciBvZiBiZWRyb29tcyosIGJ1dCByYXRoZXIgaW4gdGhlIGNoYW5nZSBpbiBwcmVtaXVtIGZvciBlYWNoIGxldmVsIG9mIG51bWJlciBvZiBiZWRyb29tcy4gICAgCj4KPiBUaGUgZnVsbHkgY29udHJvbGVkIEFscGhhIG1vZGVsIHJlc3VsdHMgc2hvdyB0aGF0IHRoZSBldmVyYWdlIHByZW1pdW0gZm9yIGVhY2ggbGV2ZWwgb2YgbnVtYmVyIG9mIGJlZHJvb21zIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGluIHJlc3BvbnNlIHRvIGluY3JlYXNlcyBpbiBkYWlseSBpbmZlY3Rpb25zLiBFdmVyeSBpbmNyZWFzZSBmb3VuZCBpcyBhdCBsZWFzdCBzaWduaWZpY2FudCBhdCB0aGUgcCA8IDAuMDUgbGV2ZWwgZXhjZXB0IGZvciBzaW5nbGUgYmVkcm9vbSBob21lcy4gVGhlcmVmb3JlLCBJIHJlamVjdCB0aGUgJEhfMDokIG9mIGh5cG90aGVzaXMgSUkgYW5kIGNvbmNsdWRlIHRoYXQgdGhlIENvdmlkLTE5IGNyaXNpcyBzaWduaWZpY2FudGx5IGluY3JlYXNlZCBkZW1hbmQtcHJlbWl1bXMgZm9yIGV2ZXJ5IGxldmVsIG9mIG51bWJlciBvZiBiZWRyb29tcyBncmVhdGVyIHRoYW4gMS4gSXQgc2hvdWxkIGFsc28gYmUgbm90ZWQgdG8gdGhlIHByZW1pdW0gaW5jcmVhc2UgaXMgaW5jcmVhc2luZyBsYXJnZXIgZm9yIGF0IGVhY2ggbGV2ZWwsIHN1Z2dlc3RpbmcgdGhhdCB0aGUgcHJlbWl1bSBmb3IgdGhlIDR0aCBiZWRyb29tIGluIGEgaG9tZSBpbmNyZWFzZWQgbW9yZSB0aGFuIHRoZSBwcmVtaXVtIGZvciB0aGUgM3JkIGJlZHJvb20uIFBvc3NpYmxlIHRoZW9yaWVzIHJlZ2FyZGluZyB0aGlzIHNpZ25pZmljYW50IHNoaWZ0IGluIHByZW1pdW1zIGlzIGV4cGxvcmVkIGluIHNlY3Rpb24gNy4KCgojIyMjIyA2LjIuMiBWaXN1YWwgUmV2aWV3CkdlbmVyYWwgZGlzdHJpYnV0aW9uIG9mIG51bWJlciBvZiBiZWRyb29tcyBwZXIgcmVzaWRlbnRpYWwgcHJvcGVydHkuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0JlZHMvYmVkX2Rpc3RfZ2VuLnBuZyl7d2lkdGg9NzAlfQo8L2NlbnRlcj4KCjxicj4KCkRpc3RyaWJ1dGlvbnMgb2YgcHJpY2VzIGF0IGVhY2ggbGV2ZWwgb2YgbnVtYmVyIG9mIGJlZHJvb21zIChsaHMpIGFuZCB0aGUgZGlzdHJpYnV0aW9ucyBvZiBwcmljZXMgYXQgZWFjaCBsZXZlbCBvZiBudW1iZXIgb2YgYmVkcm9vbXMgc3BsaXQgYnkgYmVmb3JlIGFuZCBhZnRlciBpbmZlY3Rpb24gcGVyaW9kIChyaHMpLgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9CZWRzL2JlZF9jb21iaW5lZC5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKPGJyPgoKSXQgaXMgYWxzbyBpbnN0cnVjdGl2ZSB0byBsb29rIGF0IHRoZSBzYW1lIHR3byBwbG90cyBhYm92ZSwgYnV0IG5vcm1hbGl6ZWQgYnkgc3F1YXJlIGZvb3RhZ2UuIFdlIHNlZSBhIHNpZ25pZmljYW50IGZsYXR0ZW5pbmcgYmV0d2VlbiBlYWNoIGxldmVsIG9mIG51bWJlciBvZiBiZWRyb29tcywgaG93ZXZlciwgYSBkaXN0aW5jdCBjaGFuZ2UgZnJvbSBwcmUgdnMuIHBvc3QgaW5mZWN0aW9uIHBlcmlvZCBpcyBzdGlsbCB2aXNpYmxlIChyaHMpLiBUaGUgbmV4dCBzZWN0aW9uIHdpbGwgdGVzdCBpZiB0aGlzIHNoaWZ0IGZyb20gcG9zdCB0byBwcmUtY29yb25hIGlzIHNpZ25pZmljYW50bHkgaW4gZ2VuZXJhbCwgYW5kIHNpZ25pZmljYW50bHkgcmVsYXRlZCB0byBkYWlseSBpbmZlY3Rpb25zLgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9CZWRzL2JlZF9wcHNmX2NvbWJpbmVkLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjIuMyBPTFMgTW9kZWxpbmcKVW5kZXIgdGhlIGZ1bGx5IGNvbnRyb2xsZWQgQWxwaGEgbW9kZWwsIHdlIHNlZSB0aGF0IGNvcm9uYS1kcml2ZW4gcHJlbWl1bXMgY2hhbmdlcyBhdCBldmVyIGxldmVsIG9mIG51bWJlciBvZiBiZWRyb29tcyBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGV4Y2VwdCBmb3Igc2luZ2xlLWJlZHJvb20gcHJvcGVydGllcy4gVGhpcyBmaW5kaW5nIHN1Z2dlc3QgdGhhdCBmb3IgZXZlcnkgYWRkaXRpb25hbCAzLW1vbnRoLW1vdmluZy1hdmVyYWdlIGRhaWx5IGluZmVjdGlvbiBwcmVzZW50IGF0IHRoZSB0aW1lIHRoZSBwcm9wZXJ0eSBpcyBzb2xkIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhdmVyYWdlIGluY3JlYXNlIG9mIDI1LCAzMiwgMzcsIDI3LCBhbmQgNDcgVVNEIGZvciBsZXZlbHMgMi10aHJvdWdoLTUgcmVzcGVjdGl2ZWx5LiAgICAgIAoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9CZWRzL09MU19PdXRwdXQucG5nKXt3aWR0aD01MCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyMgNi4yLjQgTUwgTW9kZWxpbmcKRHVlIHRvIG51bWJlciBvZiBiZWRyb29tcyBiZWluZyBjYXRlZ29yaWNhbCwgdGhlIHJlc3VsdHMgb2YgdGhlIFhHQm9vc3QgbW9kZWwgZm9yIHRoZXNlIHZhcmlhYmxlcyBhcmUgbm90IGFzIGVhc2lseSB2aXN1YWxseSByZXByZXNlbnRlZCBhcyBjb250aW51b3VzIHZhcmlhYmxlcywgd2hpY2ggaGF2ZSBhbiBlYXNpZXIgaW50ZXJwcmV0YXRpb24gdGhyb3VnaCBQRFBzLiBIb3dldmVyLCB3ZSBjYW4gY29uc2lkZXIgdGhlIHJlc3VsdHMgaW4gd3JpdHRlbiBmb3JtIGFuZCB3aXRoIGFkanVzdGVkIGdyYXBocyB0byByZXByZXNlbnQgdGhlIGltcG9ydGFuY2UgcmFua2luZ3MuIAoKVGhlIHZhcmlhYmxlIGltcG9ydGFuY2UgcmFua2luZyBvZiBlYWNoIGZhY3RvciBsZXZlbCBmcm9tIDEtdGhyb3VnaC01IGJlZHJvb21zIGlzIDg0LCA2MCwgNDcsIDM0LCBhbmQgNjggcmVzcGVjdGl2ZWx5IGZyb20gdGhlIHRvdGFsIDEwNCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgbW9kZWwuIFRoaXMgcmVsYXRpdmVseSBsb3cgcmVsZXZhbmNlIGlzIGV4cGVjdGVkLCBhcyBtdWNoIG9mIHRoZSBleHBsYW5hdG9yeSBwb3dlciBvZiBiZWRyb29tcyBvbiBwcmljZSBpcyB0YWtlbiBieSB0b3RhbCBsaXZpbmcgYXJlYSwgcmFua2VkIG51bWJlciAxIGluIHRoZSBpbXBvcnRhbmNlIG1hdHJpeC4gSG93ZXZlciwgd2Ugc2VlIHRoYXQgdGVzdCBNU0UgaXMgbWluaW1pemVkIGJ5IGluY3JlYXNpbmcgcHJpY2UgYXQgZWFjaCBsZXZlbCBvZiBudW1iZXIgb2YgYmVkcm9vbXMuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0JlZHMvYmVkc19pbXBvcnRhbmNlLnBuZyl7d2lkdGg9NjAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMgNi4zIENvdmlkLTE5OiBQcmVtaXVtIGZvciBDaXR5IENlbnRyYWxpdHkKKkZvcmV3b3JkIGZvciB0aGlzIHNlY3Rpb246KgoKSW4gdGhpcyBzZWN0aW9uLCBpdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGEgcHJvcGVydHkgYmVpbmcgd2l0aGluIGNpdHkgbGltaXRzIGRvZXMgbm90IG1lYW4gdGhhdCBpdCBzaG91bGQgYmUgdmlld2VkIGFzIGJlaW5nIGluIHRoZSBjZW50ZXIgb2YgYSBtYWpvciBjaXR5LiBUaGlzIGNhdGVnb3JpemF0aW9uIGlzIGJldHRlciB1bmRlcnN0b29kIGFzIGEgZGlzdGluY3Rpb24gZnJvbSBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBydXJhbCwgc3VjaCBhcyBwcm9wZXJ0aWVzIG9uIGZhcm0gbGFuZCBhbmQgaGVhdmlseSB3b29kZWQgb3Igb3RoZXJ3aXNlIHJlbW90ZSBhcmVhcy4gSXQgc2hvdWxkIGFsc28gYmUgbm90ZWQgdGhhdCByZXN1bHRzIGF0IHNldmVyYWwgbGV2ZWxzIG9mIGFuYWx5c2lzIHdpbGwgYmUgZGlzY3Vzc2VkLCBzdWNoIGFzIG5vbmltYWwgZGlmZmVyZW5jZXMgaW4gdGhlIHBvcHVsYXRpb25zLCBwcmljZSByZWFjdGlvbnMgdG8gZGFpbHkgaW5mZWN0aW9ucyBmb3IgZWFjaCBzdWItcG9wdWxhdGlvbiwgYW5kIHRoZSBjaGFuZ2UgaW4gcHJlbWl1bSBmb3IgYmVpbmcgd2l0aGluIGNpdHkgbGltaXRzLiAgICAKCgojIyMjIyA2LjMuMSBTdW1tYXJ5IG9mIEZpbmRpbmdzCj4gUHJlbGltaW5hcnkgYW5hbHlzaXMgb2YgY2l0eSBjZW50cmFsaXR5J3MgaW1wYWN0IG9uIGhvbWUgcHJpY2VzIHNob3dzIHRoYXQgaG9tZXMgd2l0aGluIGNpdHkgbGltaXRzIGhhdmUgYSBoaWdoZXIgcHJpY2Ugb24gYXZlcmFnZSB3aGVuIGNvbXBhcmVkIHRvIHJ1cmFsIHByb3BlcnRpZXMuIEZ1cnRoZXIgdmlzdWFsIGFuYWx5c2lzIHN1Z2dlc3RzIHRoYXQgcHJpY2VzIGdyZXcgaW4gYm90aCBzdWItcG9wdWxhdGlvbnMgcG9zdCB2cy4gcHJlLWluZmVjdGlvbiBwZXJpb2QsIHdpdGggY2l0eS1jaW50cmFsIHByb3BlcnRpZXMgZXhwZXJpbmNpbmcgdGhlIGxhcmdlciBub21pbmFsIHNoaWZ0IGluIGF2ZXJhZ2UgcHJpY2VzLiBUaGUgWEdCb29zdCBtb2RlbCBzaG93cyB0aGF0IGFuIGluY3JlYXNlIGluIHByZWRpY3Rpb24gcHJpY2Ugd2hlbiBhIHByb3BlcnR5IGlzIHdpdGhpbiBjaXR5IGxpbWl0cyBtYXhpbWFsbHkgcmVkdWNlcyB0aGUgbW9kZWwncyB0ZXN0IE1TRSwgc3VnZXN0aW5nIHRoaXMgdmFyaWFibGUgaXMgYSBnZW5lcmFsbHkgaW1wb3J0YW50IGZlYXR1cmUsIHdpdGggYSByYW5raW5nIG9mIDQyIGluIHRoZSBpbXBvcnRhbmNlIG1hdHJpeC4gIAo+Cj4gSW4gdGhlIGZ1bGx5IGNvbnRyb2xsZWQgQWxwaGEgbW9kZWwsIHRoZSBjb2VmZmljaWVudCBmb3IgZGFpbHkgaW5mZWN0aW9ucyBhbmQgY2l0eSBsaW1pdHMgc3VnZ2VzdHMgdGhhdCBlYWNoIGFkZGl0aW9uYWwgaW5mZWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhdmVyYWdlICppbmNyZWFzZSBvZiAkNS4xNyogaW4gdGhlIHByZW1pdW0gZm9yIGJlaW5nIGxvY2F0ZWQgd2l0aGluIGNpdHkgbGltaXRzIGNvbXBhcmVkIHRvIHByb3BlcnR5IG5vdCB3aXRoaW4gY2l0eSBsaW1pdHMsIGNldGVyaXMgcGFyYWJ1cy4gVGhpcyBmaW5kaW5nIGlzIHNpZ25pZmljYW50IGF0IHRoZSAqcCA8IDAuMDAqIGxldmVsLiBUaGVyZWZvcmUsIEkgcmVqZWN0IHRoZSAkSF8wOiQgb2YgaHlwb3RoZXNpcyBJSUkgYW5kIGNvbmNsdWRlIHRoYXQgdGhlIENvdmlkLTE5IGNyaXNpcyBpbXBhY3RlZCBwcm9wZXJ0aWVzIHdpdGhpbiBjaXR5IGxpbWl0cyBtb3JlIHRoYW4gdGhvc2Ugbm90IHdpdGhpbiBjaXR5IGxpbWl0cy4KCiMjIyMjIDYuMy4yIFZpc3VhbCBSZXZpZXcKPGJyPgoKVG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGVmZmVjdCBjb3JvbmEgaGFkIG9uIHByb3BlcnRpZXMgc3BlY2lmaWNhbGx5IGxvY2F0ZWQgd2l0aGluIGNpdHkgbGltaXRzLCBJIHNwbGl0IHRoZSBjaXR5X2xpbWl0cyBkaXN0cmlidXRpb24gYnkgaW5mZWN0aW9uIHBlcmlvZHMuIFRoaXMgc2VwYXJhdGlvbiBzaG93cyBhIGNsZWFyIGluY3JlYXNlIGluIGFzc29jaWF0aW9uIHdpdGggdGhlIGluZmVjdGlvbnMgcGVyaW9kLiAgCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ2l0eS9kaXN0X2NpdHlfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjMuMyBPTFMgTW9kZWxpbmcKRmlyc3QsIHdlIGxvb2sgYXQgdGhlIG1haW4gcmVzdWx0IHdoaWNoIHRlc3RzIHRoZSBjaGFuZ2UgaW4gcHJlbWl1bSBmb3IgYmVpbmcgd2l0aGluIGNpdHkgbGltaXRzLCBpbiBjb25zdHJhc3QgdG8gcnVyYWwgcHJvcGVydGllcywgYmVmb3JlIHZzLiBhZnRlciBpbmZlY3Rpb24gcGVyaW9kLiBUaGlzIGZpbmRpbmcgc2hvd3MgZWFjaCBhZGRpdGlvbmFsIGluZmVjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYXZlcmFnZSBjaXR5X2xpbXRzIHByZW1pdW0gKmluY3JlYXNlIG9mICQ1LjE3KiBjb21wYXJlZCB0byBwcm9wZXJ0eSBub3Qgd2l0aGluIGNpdHkgbGltaXRzLCBjZXRlcmlzIHBhcmFidXMuIFRoaXMgZmluZGluZyBpcyBzaWduaWZpY2FudCBhdCB0aGUgKnAgPCAwLjAwKiBsZXZlbC4KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ2l0eS9PTFMucG5nKXt3aWR0aD01MCV9CjwvY2VudGVyPgoKPGJyPgoKVG8gZnVydGhlciBoaWdobGlnaHQgdGhlIGRpZmZlcmVuY2VzIGluIGNvcm9uYSdzIGltcGFjdCBvZiBwcm9wZXJ0aWVzIHdpdGhpbiBjaXR5IGxpbWl0cyB2cyBvdXRzaWRlIG9mIGNpdHkgbGltaXRzLCBJIHJhbiBhIHNlcGFyYXRlIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIGVhY2ggc3ViLXBvcHVsYXRpb24gd2l0aCBhbGwgb2YgdGhlIHN0YW5kYXJkIGNvbnRyb2xzIG9mIHRoZSBBbHBoYSBtb2RlbCB0byBzZWUgdGhlIGltcGFjdCBvZiBkYWlseSBpbmZlY3Rpb25zIG9uIHByaWNlcy4gVGhpcyByZXN1bHRzIHNob3dzIHRoYXQgcHJvcGVydGllcyB3aXRoaW4gY2l0eSBsaW1pdHMgKGxocykgaGF2ZSBhbiBhdmVyYWdlIGluY3JlYXNlIG9mICQ5LjE1IHBlciBhZGRpdGlvbmFsIGRhaWx5IGluZmVjdGlvbiB3aGljaCBpcyBzaWduaWZpY2FudCBhdCB0aGUgKnAgPCAwLjAwKiBsZXZlbCwgd2hpbGUgdGhlIG1vZGVsIGZvciBydXJhbCBwcm9wZXJ0aWVzIChyaHMpIHNob3dzIHRoYXQgZGFpbHkgaW5mZWN0aW9ucyBpcyBub3QgYSBzaWduaWZpY2FudCB2YXJpYWJsZSBpbiBleHBsYWluaW5nIHZhcmlhdGlvbnMgaW4gcHJpY2VzLiBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCBob3cgbXVjaCBzbWFsbGVyIHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGlzIGluIHRoZSBydXJhbCBtb2RlbC4gICAKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ2l0eS9PTFNfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgoKIyMjIyMgNi4zLjQgTUwgTW9kZWxpbmcKPGJyPgpUaGUgWEdCb29zdCBQRFAgb2YgdGhlIGNpdHlfbGltaXRzIGR1bW15IHZhcmlhYmxlIHNob3dzIHRoYXQgaW5jcmVhc2luZyBwcm9wZXJ0eSB2YWx1ZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyB3aXRoaW4gY2l0eSBsaW1pdHMgbWF4aW1hbGx5IHJlZHVjZXMgdGVzdCBNU0UuIAoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9DaXR5L0NpdHlfUERQLnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMgNi40IENvdmlkLTE5OiBQcmVtaXVtIGZvciBTaXplCiMjIyMjIDYuNC4xIFN1bW1hcnkgb2YgRmluZGluZ3MKPiBBbiBhbmFseXNpcyBvZiBzaXplIHNob3dzIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHNtb290aGx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgZGF0YSBzZXQgd2l0aCB0aGUgYXZlcmFnZSB0b3RhbCBsaXZpbmcgYXJlYSBtYXJnaW5hbGx5IGhpZ2hlciBpbiB0aGUgcG9zdC1pbmZlY3Rpb25zIHBlcmlvZC4gVGhlIFhHQm9vc3QgbW9kZWwgcmFua2VzIHRoaXMgZmVhdHVyZSBhcyB0aGUgbnVtYmVyIG9uZSBtb3N0IGltcGFydGFudCB2YXJpYWJsZSBpbiBwcmVkaWN0aW5nIHByaWNlcy4gCj4KPiBJbiB0aGUgZnVsbHkgY29udHJvbGxlZCBBbHBoYSBtb2RlbCwgdGhlIGNvZWZmaWNpZW50IGZvciBkYWlseSBpbmZlY3Rpb25zIGFuZCB0b3RhbCBsaXZpbmcgYXJlYSBzdWdnZXN0cyB0aGF0IGVhY2ggYWRkaXRpb25hbCBpbmZlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGF2ZXJhZ2UgcHJlbWl1bSAqaW5jcmVhc2Ugb2YgJDAuMDIqIGZvciB0b3RhbCBsaXZpbmcgYXJlYSwgbWVhc3VyZWQgcGVyIHNxdWFyZSBmb290LCBjZXRlcmlzIHBhcmFidXMuIFRoaXMgZmluZGluZyBpcyBzaWduaWZpY2FudCBhdCB0aGUgKnAgPCAwLjAwKiBsZXZlbC4gVGhlcmVmb3JlLCBJIHJlamVjdCB0aGUgJEhfMDokIG9mIGh5cG90aGVzaXMgSVYgYW5kIGNvbmNsdWRlIHRoYXQgdGhlIENvdmlkLTE5IGNyaXNpcyBpbmNyZWFzZWQgdGhlIHByZW1pdW0gZm9yIHByb3BlcnR5IHNpemUuCj4KPiBGdXJ0aGVybW9yZSwgSSBoYXZlIHJ1biBhIHNlcGFyYXRlIEFscGhhIG1vZGVsIGZvciB0aGUgdG9wIGFuZCBib3R0b20gMjV0aCBwZXJjZW50aWxlIG9mIHRvdGFsIGxpdmluZyBhcmVhLiBUaGVzZSByZXN1bHRzIHNob3cgdGhhdCB0aGUgcHJlbWl1bSBmb3IgdGhlIHNtYWxsZXN0IGhvbWVzIGRlY3JlYXNlcyBwZXIgYWRkaXRpb25hbCBkYWlseSBpbmZlY3Rpb24gKC0zLjE1IFVTRCwgcCA8IDAuMDApLCB3aGlsZSBob21lcyBpbiB0aGUgdG9wIDI1dGggcGVyY2VudGlsZSBpbmNyZWFzZSB3aXRoIHJlc3BlY3QgdG8gZGFpbHkgaW5mZWN0aW9ucyAoLTMuMTUgVVNELCBwIDwgMC4wMCkuIFRoaXMgc3VnZ2VzdHMgYSBzaGlmdCBhd2F5IGZyb20gc21hbGxlciBob21lcyBhbmQgdG93YXJkcyBsYXJnZXIgaG9tZXMgaW4gcmVzcG9uc2UgdG8gdGhlIGNvcm9uYSBjcmlzaXMuIFRoZXJlZm9yZSwgSSByZWplY3QgdGhlICRIXzA6JCBvZiBoeXBvdGhlc2lzIFYgYW5kIGNvbmNsdWRlIHRoYXQgdGhlIENvdmlkLTE5IGNyaXNpcyBpbXBhY3RlZCBwcm9wZXJ0aWVzIGluIHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIHByb3BlcnR5IHNpemUgbW9yZSB0aGFuIHRoZSBib3R0b20gMjV0aAoKIyMjIyMgNi40LjIgVmlzdWFsIFJldmlldwpUb3RhbCBsaXZpbmcgYXJlYSBpcyByZWxhdGl2ZWx5IHNtb290aGx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgZGF0YSBzZXQgd2l0aCB0aGUgYXZlcmFnZSB0b3RhbCBsaXZpbmcgYXJlYSBtYXJnaW5hbGx5IGhpZ2hlciBpbiB0aGUgcG9zdC1pbmZlY3Rpb25zIHBlcmlvZC4gU2luY2UgdGhpcyBmZWF0dXJlIGlzIHJvdWdobHkgc3RhYmxlIGluIHRoZSBzaG9ydCBydW4sIHRoaXMgcmVzdWx0IGlzIGV4cGVjdGVkLgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9MaXZpbmdfYXJlYS9hcmVhX2Rpc3RfdG90YWxfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgpQcmljZSBkaXN0cmlidXRpb24sIGhvd2V2ZXIsIGRpZmZlciBiZXR3ZWVuIHByZSBhbmQgcG9zdC1pbmZlY3Rpb24gcGVyaW9kIHdoZW4gbm9ybWFsaXplZCBieSBwZXIgc3F1YXJlIGZvb3QgKHNxZnQuKS4KPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9MaXZpbmdfYXJlYS9hcmVhX2Rpc3RfcHJpY2VfY29yb25hYS5wbmcpe3dpZHRoPTcwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjQuMyBPTFMgTW9kZWxpbmcKVGhlIGZ1bGx5IGNvbnRyb2xsZWQgQWxwaGEgbW9kZWwgc2hvd3MgdGhlIGNvZWZmaWNpZW50IGZvciBkYWlseSBpbmZlY3Rpb25zIGFuZCB0b3RhbCBsaXZpbmcgYXJlYSBzdWdnZXN0cyB0aGF0IGVhY2ggYWRkaXRpb25hbCBpbmZlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGF2ZXJhZ2UgcHJlbWl1bSAqaW5jcmVhc2Ugb2YgJDAuMDIqIGZvciB0b3RhbCBsaXZpbmcgYXJlYSwgbWVhc3VyZWQgcGVyIHNxdWFyZSBmb290LCBjZXRlcmlzIHBhcmFidXMuIFRoaXMgZmluZGluZyBpcyBzaWduaWZpY2FudCBhdCB0aGUgKnAgPCAwLjAwKiBsZXZlbC4KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvTGl2aW5nX2FyZWEvYXJlYV90b3RhbC5wbmcpe3dpZHRoPTUwJX0KPC9jZW50ZXI+Cgo8YnI+CgpUbyBmdXJ0aGVyIHRlc3QgdGhpcyByZWxhdGlvbnNoaXAsIEkgaGF2ZSBydW4gYSBzZXBhcmF0ZSBBbHBoYSBtb2RlbCBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIDI1dGggcGVyY2VudGlsZSBvZiB0b3RhbCBsaXZpbmcgYXJlYS4gVGhlc2UgcmVzdWx0cyBzaG93IHRoYXQgdGhlIHByZW1pdW0gZm9yIHRoZSBzbWFsbGVzdCBob21lcyBkZWNyZWFzZXMgcGVyIGFkZGl0aW9uYWwgZGFpbHkgaW5mZWN0aW9uICgtMy4xNSBVU0QsIHAgPCAwLjAwKSwgd2hpbGUgaG9tZXMgaW4gdGhlIHRvcCAyNXRoIHBlcmNlbnRpbGUgaW5jcmVhc2Ugd2l0aCByZXNwZWN0IHRvIGRhaWx5IGluZmVjdGlvbnMgKC0zLjE1IFVTRCwgcCA8IDAuMDApLiBUaGlzIHN1Z2dlc3RzIGEgc2hpZnQgYXdheSBmcm9tIHNtYWxsZXIgaG9tZXMgYW5kIHRvd2FyZHMgbGFyZ2VyIGhvbWVzIGluIHJlc3BvbnNlIHRvIHRoZSBjb3JvbmEgY3Jpc2lzLgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0xpdmluZ19hcmVhL1NjcmVlbiBTaG90IDIwMjItMDItMDYgYXQgMTguMzYuNDYucG5nKXt3aWR0aD0xMDAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDYuNC40IE1MIE1vZGVsaW5nClRoZSBQRFAgYW5kIElDRSBwbG90cyBzaG93IGEgc3RhYmxlIGFuZCBjb25zaXN0YW50IGluY3JlYXNlIGluIHByaWNlcyBhcyB0b3RhbCBsaXZpbmcgYXJlYSBpbmNyZWFzZXMuCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvTGl2aW5nX2FyZWEvYXJlYV9QRFAucG5nKXt3aWR0aD05MCV9CjwvY2VudGVyPgoKPGJyPgoKVGhlIGhlYXRtYXBzIG9mIHByZWRpY3RlZCBwcmljZSB3aXRoIHJlc3BlY3QgdG8gZGFpbHkgaW5mZWN0aW9ucyBhbmQgdG90YWwgbGl2aW5nIGFyZWEgc2hvdyB0aGF0IGJvdGggdmFyaWFibGVzIGNvbnNpc3RlbnRseSBpbmNyZWFzZSBYR0Jvb3N0J3MgcHJpY2UgcHJlZGljdGlvbnMsIHdpdGggdGhlIE1heGltYWwgUHJpY2UgUmVnaW9uIChNUFIpIGF0IHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIGJvdGggdmFyaWFibGVzLgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0xpdmluZ19hcmVhL2FyZWFfaGVhdF9jb20ucG5nKXt3aWR0aD0xMDAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMgNi41IENvdmlkLTE5OiBQcmVtaXVtIGZvciBBZ2UgCiMjIyMjIDYuNS4xIFN1bW1hcnkgb2YgRmluZGluZ3MKPiBBIHByZWxpbWluYXJ5IGFuYWx5c2lzIG9mIGFnZSBzaG93cyB0aGF0IHRoaXMgZmVhdHVyZSBpcyBkaWZmZXJlbnQgaW4gdGhlIHByZSBhbmQgcG9zdC1pbmZlY3Rpb25zIHBlcmlvZHMsIHdpdGggdGhlIGxvd2VyIGF2ZXJhZ2UgYWdlIG9mIGhvbWVzIHNvbGQgaW4gdGhlIHBvc3QtaW5mZWN0aW9uIHBlcmlvZCBzdWdnZXN0aW5nIHRoYXQgaG9tZSBvd25lcnMgcHJlZmVyZSwgb24gYXZlcmFnZSwgbmV3ZXIgaG9tZXMuIFRoZSBYR0Jvb3N0IG1vZGVsIHJhbmtlcyB0aGlzIGZlYXR1cmUgYXMgdGhlIHNlY29uZCBtb3N0IGltcGFydGFudCB2YXJpYWJsZSBpbiBwcmVkaWN0aW5nIHByaWNlcy4gCj4KPiBJbiB0aGUgZnVsbHkgY29udHJvbGxlZCBBbHBoYSBtb2RlbCwgdGhlIGNvZWZmaWNpZW50IGZvciBkYWlseSBpbmZlY3Rpb25zIGFuZCBhZ2Ugc3VnZ2VzdHMgdGhhdCBlYWNoIGFkZGl0aW9uYWwgZGFpbHkgaW5mZWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhdmVyYWdlIHByZW1pdW0gKmRlY3JlYXNlIG9mICQwLjA2KiBmb3IgZWFjaCBhZGl0aW9uYWwgeWVhciBvZiBhZ2UsIGNldGVyaXMgcGFyYWJ1cy4gVGhpcyByZXN1bHQgY2FuIGJlIGludGVycHJldGVkIGFzIGFuIGluY3JlYXNlIGluIHRoZSBwZW5pbHR5IHBlciBhZGRpdG9uYWwgeWVhciBvZiBhZ2UsIG1ha2luZyBvbGRlciBob21lIGV2ZW4gbW9yZSB1bmRpc2lyYWJsZSBwb3N0LWluZmVjdGlvbnMgcGVyaW9kLiBUaGlzIGZpbmRpbmcgaXMgc2lnbmlmaWNhbnQgYXQgdGhlICpwIDwgMC4wMCogbGV2ZWwuIFRoZXJlZm9yZSwgSSByZWplY3QgdGhlICRIXzA6JCBvZiAqaHlwb3RoZXNpcyBWSSogYW5kIGNvbmNsdWRlIHRoYXQgVGhlIENvdmlkLTE5IGNyaXNpcyBkZWNyZWFzZWQgdGhlIHByZW1pdW0gZm9yIHByb3BlcnR5IGFnZS4KPgo+IEZ1cnRoZXJtb3JlLCBJIGhhdmUgcnVuIGEgc2VwYXJhdGUgQWxwaGEgbW9kZWwgZm9yIHRoZSB0b3AgYW5kIGJvdHRvbSAyNXRoIHBlcmNlbnRpbGUgb2YgYWdlLiBUaGVzZSByZXN1bHRzIHNob3cgdGhhdCB0aGUgcHJlbWl1bSBmb3IgdGhlIG9sZGVzdCBob21lcyBkZWNyZWFzZXMgcGVyIGFkZGl0aW9uYWwgZGFpbHkgaW5mZWN0aW9uICgtMi43NSBVU0QsIHAgPCAwLjAwKSwgd2hpbGUgdGhlIHByZW1pdW0gZm9yIGJlaW5nIGluIHRoZSBib3R0b20gMjV0aCBwZXJjZW50aWxlIG9mIGFnZSAoaS5lLiBuZXdlc3QgaG9tZXMpIGlzIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBwcmUgdnMgcG9zdC1pbmZlY3Rpb24gcGVyaW9kLiBUaGlzIHN1Z2dlc3RzIGEgZGlzdGluY3Qgc2hpZnQgYXdheSBmcm9tIG9sZGVyIGhvbWVzIGluIHJlc3BvbnNlIHRvIHRoZSBjb3JvbmEgY3Jpc2lzLiBUaGVyZWZvcmUsIEkgcmVqZWN0IHRoZSAkSF8wOiQgb2YgKmh5cG90aGVzaXMgVklJKiBhbmQgY29uY2x1ZGUgdGhhdCB0aGUgQ292aWQtMTkgY3Jpc2lzIGltcGFjdGVkIHByb3BlcnRpZXMgaW4gdGhlIHRvcCAyNXRoIHBlcmNlbnRpbGUgb2YgcHJvcGVydHkgYWdlIG1vcmUgdGhhbiB0aGUgYm90dG9tIDI1dGguCgoKIyMjIyMgNi41LjIgVmlzdWFsIFJldmlldwpUaGUgZ3JhcGggYmVsb3cgaGlnaGxpZ2h0cyB0aGUgZGlmZmVyZW5jZXMgaW4gdGhlIGFnZSBkaXN0cmlidXRpb25zIGJldHdlZW4gdGhlIHByZSBhbmQgcG9zdCBpbmZlY3Rpb25zIHBlcmlvZCBncm91cHMuIFdlIHNlZSBhIGRlY3JlYXNlIGluIHRoZSBhdmVyYWdlIGFnZSBpbiBob21lcyBzb2xkIGluIHRoZSBwb3N0LWluZmVjdGlvbiBwZXJpb2QuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0FnZS9hZ2VfZGlzdHNfY29tLnBuZyl7d2lkdGg9OTAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDYuNS4zIE9MUyBNb2RlbGluZwpBbHBoYSBtb2RlbCwgZmluZHMgdGhhdCBlYWNoIGFkZGl0aW9uYWwgZGFpbHkgaW5mZWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhdmVyYWdlIHByZW1pdW0gKmRlY3JlYXNlIG9mICQwLjA2KiBmb3IgZWFjaCBhZGRpdGlvbmFsIHllYXIgb2YgYWdlLCBjZXRlcmlzIHBhcmFidXMuIFRoaXMgcmVzdWx0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbmNyZWFzZSBpbiB0aGUgcGVuYWx0eSBwZXIgYWRkaXRpb25hbCB5ZWFyIG9mIGFnZSwgbWFraW5nIG9sZGVyIGhvbWUgZXZlbiBtb3JlIHVuZGVzaXJhYmxlIGluIHRoZSBwb3N0LWluZmVjdGlvbnMgcGVyaW9kLiBUaGlzIGZpbmRpbmcgaXMgc2lnbmlmaWNhbnQgYXQgdGhlICpwIDwgMC4wMCogbGV2ZWwuCgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0FnZS9hZ2VfZ2VuLnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KClR3byBzZXBhcmF0ZSBBbHBoYSBtb2RlbHMgZm9yIHRoZSB0b3AgYW5kIGJvdHRvbSAyNXRoIHBlcmNlbnRpbGUgb2YgYWdlIHNob3cgdGhhdCB0aGUgcHJlbWl1bSBmb3IgdGhlIG9sZGVzdCBob21lcyAqZGVjcmVhc2VzKiBwZXIgYWRkaXRpb25hbCBkYWlseSBpbmZlY3Rpb24gKC0yLjc1IFVTRCwgcCA8IDAuMDApLCB3aGlsZSB0aGUgcHJlbWl1bSBmb3IgYmVpbmcgaW4gdGhlIGJvdHRvbSAyNXRoIHBlcmNlbnRpbGUgb2YgYWdlIChpLmUuIG5ld2VzdCBob21lcykgaXMgKm5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCogcHJlIHZzIHBvc3QtaW5mZWN0aW9uIHBlcmlvZC4gVGhpcyBzdWdnZXN0cyB0aGF0IGhvbWUgb3duZXJzIHNoaWZ0ZWQgZGlzdGljdGx5IGF3YXkgZnJvbSBvbGRlciBob21lcyBtb3JlIHRoYW4gdG93YXJkcyBuZXdlciBob21lcy4KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQWdlL2FnZV9vbHNfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjUuNCBNTCBNb2RlbGluZwpUaGUgWEdCb29zdCBtb2RlbCdzIFBEUCBhbmQgSUNFIHBsb3RzIHNob3cgdGhlIGV4cGVjdGVkIGNvbnZleGVkIHNoYXBlIGJldHdlZW4gYWdlIGFuZCBwcmljZSBwcmVkaWN0aW9ucyB3aXRoIGFuIGluZmxlY3Rpb24gcG9pbnQgYXQgYXBwcm94aW1hdGx5IDY1IHllYXJzLiBTaW5jZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBwcm9wZXJ0aWVzIHNvbGQgaW4gbXkgdGltZSBzYW1wbGUgYXJlIGJldHdlZW4gdGhlIGFnZXMgb2YgMCBhbmQgNTUgeWVhcnMgb2xkICg5NCUpLCB0aGUgZG93bndhcmQgcmVsYXRpb25zaGlwIGJldHdlZW4gYWdlIGFuZCBwcmljZSBwcmVkaWNpdG9uIGlzIG1vc3QgcmVsaXZlbnQgZm9yIHRoaXMgcGFwZXIuICAgCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0FnZS9hZ2VfUERQLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgpUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgbWFyZ2luYWwgaW1wYWN0IG9mIGFnZSBhbmQgZGFpbHkgaW5mZWN0aW9ucyBvbiBwcmVkaWN0ZWQgaG9tZSBwcmljZXMsIHdlIHR1cm4gdG8gdGhlIGhlYXQgbWFwcyBiZWxvdy4gSXQgY2FuIGJlIHNlZW4gdGhhdCB0aGUgaGlnaGVzdCBtYXJnaW5hbCBwcmljZSBhZGRpdGlvbnMgaGFwcGVuIGluIHRoZSByZWdpb246IDAgPCBhZ2UgPCAxMCBhbmQgMTgwMCA8IGluZmVjdGlvbnMgPCAyMzAwLiAKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQWdlL2FnZV9oZWF0X2NvbS5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyA2LjYgQ292aWQtMTk6IENoYW5nZSBpbiBEYXlzIG9uIE1hcmtldAoqRm9yZXdvcmQgZm9yIHRoaXMgc2VjdGlvbjoqCgpEYXlzIG9uIG1hcmtldCAoRE9NKSBpcyBhIHN0cmFuZ2UgdmFyaWFibGUgYXMgaXQgaXMgcmVsYXRpb25zaGlwIHRvIHRoZSBmaW5hbCBzZWxsaW5nIHByaWNlIG9mIGEgaG9tZSBpcyBub3QgdW5pZGlyZWN0aW9uYWwuIFRoaXMgaXMgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGRheXMgYSBob21lIHNpdHMgb24gdGhlIG1hcmtldCBpcyBncmVhdGx5IGRldGVybWluZWQgYnkgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBsaXN0aW5nIHByaWNlIGFuZCB0aGUgYWN0dWFsIG1hcmtldCB2YWx1ZSBvZiB0aGUgaG9tZSwgd2l0aCBvdmVyLXByaWNlZCBob21lcyB0YWtpbmcgbG9uZ2VyIHRvIHNlbGwgYW5kIHVuZGVyLXByaWNlZCBob21lcyBsZXNzIHRpbWUuIEhvd2V2ZXIsIGl0IGlzIGFsc28gdGhlIGNhc2UgdGhhdCBwZW9wbGUgd2lsbCB0byB3YWl0IGZvciB0aGUgcmlnaHQgYnV5ZXIgdG8gY29tZSBhbG9uZyB3aWxsIGJlIHJld2FyZGVkIGJ5IHNlbGxpbmcgdGhlaXIgaG9tZSBhdCBhIGhpZ2hlciBwcmljZS4gVGhpcyBmZWVkYmFjayBsb29wIG1ha2VzIHN0YW5kYXJkIGVjb25vbWV0cmljIGludGVycHJldGF0aW9ucyBkaWZmaWN1bHQgYW5kIHRoZSBmb2xsb2l3bmcgcmVzdWx0cyBpbiB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlIGFuYWx5emVkIHdpdGggdGhpcyBmYWN0IGluIG1pbmQuIAoKIyMjIyMgNi42LjEgU3VtbWFyeSBvZiBGaW5kaW5ncwo+IEEgcHJlbGltaW5hcnkgYW5hbHlzaXMgb2YgRE9NIHNob3dzIHRoYXQgdGhpcyBmZWF0dXJlIG5vdGljYWJseSBzaGlmdGVkIGluIHRoZSBwb3N0LWluZmVjdGlvbiBwZXJpb2QsIHdpdGggdGhlIGF2ZXJhZ2UgRE9NIGJlaW5nIGxvd2VyIHdoZW4gY2FtcGFpcmVkIHRvIHRoZSBwcmUtaW5mZWN0aW9ucyBwZXJpb2QuIE9mIHRoZSAxMDQgdmFyaWFibGVzIHVzZWQgdG8gdHJhaW4gdGhlIFhHQm9vc3QgbW9kZWwsIERPTSBpcyByYW5rZWQgYXMgdGhlIDh0aCBtb3N0IGltcGFydGFudCB2YXJpYWJsZSBpbiBwcmVkaWN0aW5nIHByaWNlcy4gCj4KPiBJbiB0aGUgZnVsbHkgY29udHJvbGxlZCBBbHBoYSBtb2RlbCwgdGhlIGNvZWZmaWNpZW50IGZvciBkYWlseSBpbmZlY3Rpb25zIGFuZCBET00gc3VnZ2VzdHMgdGhhdCBlYWNoIGFkZGl0aW9uYWwgZGFpbHkgaW5mZWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhdmVyYWdlIHByZW1pdW0gKmRlY3JlYXNlIG9mICQwLjA0KiBmb3IgZWFjaCBhZGl0aW9uYWwgZGF5IGEgcHJvcGVydHkgc2l0cyBvbiB0aGUgbWFya2V0IGJlZm9yZSBiZWluZyBzb2xkLCBjZXRlcmlzIHBhcmFidXMuIFRoaXMgcmVzdWx0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbmNyZWFzZSBpbiB0aGUgcGVuaWx0eSBwZXIgYWRkaXRvbmFsIGRheSBvbiB0aGUgbWFya2V0LiBUaGlzIGZpbmRpbmcgaXMgc2lnbmlmaWNhbnQgYXQgdGhlICpwIDwgMC4wMCogbGV2ZWwuIFRoZXJlZm9yZSwgSSByZWplY3QgdGhlICRIXzA6JCBvZiAqaHlwb3RoZXNpcyBWSUlJKiBhbmQgY29uY2x1ZGUgdGhhdCB0aGUgQ292aWQtMTkgY3Jpc2lzIHNpZ25pZmljYW50bHkgZGVjcmVhc2VkIHRoZSBwcmVtaXVtIGZvciBkYXlzIG9uIG1hcmtldAo+Cj4gRnVydGhlcm1vcmUsIEkgaGF2ZSBydW4gYSBzZXBhcmF0ZSBBbHBoYSBtb2RlbCBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIDI1dGggcGVyY2VudGlsZSBvZiBET00uIFRoZXNlIHJlc3VsdHMgc2hvdyB0aGF0IHRoZSBuZWdhdGl2ZSBwcmVtaXVtIGZvciB0aGUgaG9tZXMgd2hpY2ggc2F0IG9uIHRoZSBtYXJrZXQgdGhlIGxvbmdlc3QgZGVjcmVhc2VkICgtMi43NSBVU0QsIHAgPCAwLjAwKSwgd2hpbGUgdGhlIHByZW1pdW0gZm9yIGJlaW5nIGluIHRoZSBib3R0b20gMjV0aCBwZXJjZW50aWxlIChpLmUuIGhvbWVzIHNvbGQgdGhlIGZhc3Rlc3QpIGlzIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBwcmUgdnMgcG9zdC1pbmZlY3Rpb24gcGVyaW9kLiBUaGVyZWZvcmUsIEkgcmVqZWN0IHRoZSAkSF8wOiQgb2YgKmh5cG90aGVzaXMgSVgqIGFuZCBjb25jbHVkZSB0aGF0IHRoZSBDb3ZpZC0xOSBjcmlzaXMgaW1wYWN0ZWQgcHJvcGVydGllcyBpbiB0aGUgdG9wIDI1dGggcGVyY2VudGlsZSBvZiBwcm9wZXJ0eSBhZ2UgbW9yZSB0aGFuIHRoZSBib3R0b20gMjV0aC4KCgojIyMjIyA2LjYuMiBWaXN1YWwgUmV2aWV3Cjxicj4KVGhlIHByZWxpbWluYXJ5IGdyYXBoaWNhbCBhbmFseXNpcyBvZiBET00gc2hvd3MgYSBjbGVhciBhdmVyYWdlIGRlY3JlYXNlIG9mIERPTSBmb3IgaG9tZXMgc29sZCBpbiB0aGUgcG9zdC1pbmZlY3Rpb24gcGVyaW9kLgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Eb20vZG9tX2Rpc3RfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjYuMyBPTFMgTW9kZWxpbmcKQWxwaGEgbW9kZWwsIHRoZSBpbnRlcmFjdGlvbiBjb2VmZmljaWVudCBmb3IgZGFpbHkgaW5mZWN0aW9ucyBhbmQgRE9NIHN1Z2dlc3RzIHRoYXQgZWFjaCBhZGRpdGlvbmFsIGRhaWx5IGluZmVjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYXZlcmFnZSBwcmVtaXVtICpkZWNyZWFzZSBvZiAkMC4wNCogZm9yIGVhY2ggYWRkaXRpb25hbCBkYXkgYSBwcm9wZXJ0eSBzaXRzIG9uIHRoZSBtYXJrZXQgYmVmb3JlIGJlaW5nIHNvbGQsIGNldGVyaXMgcGFyYWJ1cy4gVGhpcyByZXN1bHQgY2FuIGJlIGludGVycHJldGVkIGFzIGFuIGluY3JlYXNlIGluIHRoZSBwZW5hbHR5IHBlciBhZGRpdG9uYWwgZGF5IG9uIHRoZSBtYXJrZXQuIFRoaXMgZmluZGluZyBpcyBzaWduaWZpY2FudCBhdCB0aGUgKnAgPCAwLjAwKiBsZXZlbC4gCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0RvbS9kb21fZ2VuLnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KU2VwYXJhdGUgQWxwaGEgbW9kZWxzIGZvciB0aGUgdG9wIGFuZCBib3R0b20gMjV0aCBwZXJjZW50aWxlIG9mIERPTS4gVGhlc2UgcmVzdWx0cyBzaG93IHRoYXQgdGhlIG5lZ2F0aXZlIHByZW1pdW0gZm9yIHRoZSBob21lcyB3aGljaCBzYXQgb24gdGhlIG1hcmtldCB0aGUgbG9uZ2VzdCBkZWNyZWFzZWQgKC0yLjc1IFVTRCwgcCA8IDAuMDApLCB3aGlsZSB0aGUgcHJlbWl1bSBmb3IgYmVpbmcgaW4gdGhlIGJvdHRvbSAyNXRoIHBlcmNlbnRpbGUgKGkuZS4gaG9tZXMgc29sZCB0aGUgZmFzdGVzdCkgaXMgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHByZSB2cyBwb3N0LWluZmVjdGlvbiBwZXJpb2QuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0RvbS9kb21fY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjYuNCBNTCBNb2RlbGluZwpQRFAgYW5kIElDRSBncmFwaHMgc2hvdyBhIHNoYXJwIGluaXRpYWwgZGVjcmVhc2UgaW4gcHJlZGljdGlvbiBwcmljZXMgYWQgdGhlbiBhIGNvbnNpc3RlbnQgZG93bndhcmQgdHJlbmQuIFRoZSBlbmQgYmVoYXZpb3IgYXQgdGhlIHRvcCBvZiBET00gaXMgZXhwbGFpbmVkIGJ5IGEgc21hbGwgbnVtYmVyIG9mIG9ic2VydmF0aW9uIGF0IHRoZSBleHRyZW1lIGFuZCBjYW4gdGhlcmVmb3JlIGJlIGlnbm9yZWQuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0RvbS9kb21fUERQLnBuZyl7d2lkdGg9NzAlfQo8L2NlbnRlcj4KCjxicj4KVGhlIGhlYXRtYXBzIGZvciBET00gYW5kIGRhaWx5IGluZmVjdGlvbnMgc2hvdyB0aGF0IHByb3BlcnRpZXMgc29sZCBhdCBhcHByb3hpbWF0ZWx5IDAgRE9NIGFuZCB3aXRoaW4gdGhlIGluZmVjdGlvbi1wcmljZSByaWRnZSBhcmUgcHJlZGljdGVkIHRvIGhhdmUgdGhlIGhpZ2hlc3QgcHJpY2UuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0RvbS9kb21faGVhdF9jb20ucG5nKXt3aWR0aD0xMDAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMgNi43IFN1bW1hcnkgb2YgUmVzdWx0cyBhbmQgSHlwb3RoZXNpcyAKCiMjIyMjIDYuNy4xIENvdmlkLTE5OiBHZW5lcmFsIENhc2UKPiAqKkh5cG90aGVzaXMgSToqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGhvdXNpbmcgcHJpY2VzCj4KPiAqKlJlc3VsdHM6KioKCjxicj4KCiMjIyMjIDYuNy4yIENvdmlkLTE5OiBQcmVtaXVtIGZvciBCZWRyb29tcwo+ICoqSHlwb3RoZXNpcyBJSToqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGRlbWFuZC1wcmVtaXVtcyBmb3IgZXZlcnkgbGV2ZWwgb2YgbnVtYmVyIG9mIGJlZHJvb21zIGdyZWF0ZXIgdGhhbiAxIAo+Cj4gKipSZXN1bHRzOioqCgo8YnI+CgojIyMjIyA2LjcuMyBDb3ZpZC0xOTogUHJlbWl1bSBmb3IgQ2l0eSBDZW50cmFsaXR5Cj4gKipIeXBvdGhlc2lzIElJSToqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIGltcGFjdGVkIHByb3BlcnRpZXMgd2l0aGluIGNpdHkgbGltaXRzIG1vcmUgdGhhbiB0aG9zZSBub3Qgd2l0aGluIGNpdHkgbGltaXRzICAKPgo+ICoqUmVzdWx0czoqKgoKPGJyPgoKIyMjIyMgNi43LjQgQ292aWQtMTk6IFByZW1pdW0gZm9yIFNpemUKCj4gKipIeXBvdGhlc2lzIElWOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgaW5jcmVhc2VkIHRoZSBwcmVtaXVtIGZvciBwcm9wZXJ0eSBzaXplIAo+Cj4gKipSZXN1bHRzOioqCgo8YnI+Cgo+ICoqSHlwb3RoZXNpcyBWOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgaW1wYWN0ZWQgcHJvcGVydGllcyBpbiB0aGUgdG9wIDI1dGggcGVyY2VudGlsZSBvZiBwcm9wZXJ0eSBzaXplIG1vcmUgdGhhbiB0aGUgYm90dG9tIDI1dGggcGVyY2VudGlsZSAKPgo+ICoqUmVzdWx0czoqKgoKPGJyPgoKIyMjIyMgNi43LjUgQ292aWQtMTk6IFByZW1pdW0gZm9yIEFnZSAKCj4gKipIeXBvdGhlc2lzIFZJOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgZGVjcmVhc2VkIHRoZSBwcmVtaXVtIGZvciBwcm9wZXJ0eSBhZ2UgCj4KPiAqKlJlc3VsdHM6KioKCjxicj4KCj4gKipIeXBvdGhlc2lzIFZJSToqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIGltcGFjdGVkIHByb3BlcnRpZXMgaW4gdGhlIHRvcCAyNXRoIHBlcmNlbnRpbGUgb2YgYWdlIG1vcmUgdGhhbiB0aGUgYm90dG9tIDI1dGggcGVyY2VudGlsZSAgCj4KPiAqKlJlc3VsdHM6KioKCjxicj4KCiMjIyMjIDYuNy42IENvdmlkLTE5OiBDaGFuZ2UgaW4gRGF5cyBvbiBNYXJrZXQKCj4gKipIeXBvdGhlc2lzIFZJSUk6KiogVGhlIENvdmlkLTE5IGNyaXNpcyBzaWduaWZpY2FudGx5IGRlY3JlYXNlZCB0aGUgcHJlbWl1bSBmb3IgZGF5cyBvbiBtYXJrZXQgCj4KPiAqKlJlc3VsdHM6KiogCgo8YnI+Cgo+ICoqSHlwb3RoZXNpcyBJWDoqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIGltcGFjdGVkIHByb3BlcnRpZXMgaW4gdGhlIHRvcCAyNXRoIHBlcmNlbnRpbGUgb2YgZGF5cyBvbiBtYXJrZXQgbW9yZSB0aGFuIHRoZSBib3R0b20gMjV0aCBwZXJjZW50aWxlIAo+Cj4gKipSZXN1bHRzOioqCgo8YnI+PGJyPgoKIyMjIDcuIERpc2N1c3Npb24KVW5kZXIgY29uc3RydWN0aW9uCgpOb3RlOiBQcm92aWRlIGFuIG91dGxvb2sgb2YgdGhlIGZ1dHVyZSBkZXZlbG9wbWVudHMgb2YgdGhlIHBhcnRpY3VsYXIgc2NpZW50aWZpYyBkaXNjdXNzaW9uLCBkaXNjdXNzIHBvbGljeSBpbXBsaWNhdGlvbnMgYW5kIHBvaW50IG91dCBvcGVuIHF1ZXN0aW9ucy4KCjxicj48YnI+CgojIyMgOC4gQ29uY2x1c2lvbgpVbmRlciBjb25zdHJ1Y3Rpb24KClRoZSBwdXJwb3NlIG9mIHRoaXMgdGhlc2lzIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGVjb25vbWljIGltcGFjdCB0aGUgQ292aWQtMTkgY3Jpc2lzIGhhZCBvbiBob3VzaW5nIHByaWNlcyBhbmQgaG93IHRoZXNlIGltcGFjdHMgY2hhbmdlZCB0aGUgcmVsYXRpdmUgZGVtYW5kIG9mIGhvbWVvd25lcnMgZm9yIGNlcnRhaW4gaGVkb25pYyBmZWF0dXJlcyBvZiBhIGhvbWUgdXNpbmcgTG91aXNpYW5hLCBVU0EgbWFya2V0IGRhdGEuIFRvIGRldGVybWluZSB3aGljaCB2YXJpYWJsZXMgd291bGQgYmUgaW1wb3J0YW50IHRvIGFuYWx5emUsIGFuICplWHRyZW1lIEdyYWRpZW50IEJvb3N0KiAoWEdCb29zdCkgbWFjaGluZSBsZWFybmluZyBhbGdvcml0aG0gd2FzIHRyYWluZWQgb24gYSBsYXJnZSAoaS5lLiAkMTA0XHRpbWVzMjQ0MTIkKSBkYXRhc2V0IG9mIGhlZG9uaWMgZmVhdHVyZXMuIEFuIGFuYWx5c2lzIG9mIHRoZSBYR0Jvb3N0J3MgdmFyaWFibGUtaW1wb3J0YW5jZSByYW5raW5nIHNob3dzIHRoYXQgbnVtYmVyIG9mIGJlZHJvb21zLCBjaXR5IGNlbnRyYWxpdHksIHRvdGFsIGxpdmluZyBhcmVhLCBhZ2UsIGFuZCBkYXlzIG9uIHRoZSBtYXJrZXQgd2VyZSBhbW9uZyB0aGUgdG9wIG1vc3QgaW1wb3J0YW50IHZhcmlhYmxlcyBpbiBkZXRlcm1pbmUgYSBob21lcyBtYXJrZXQgcHJpY2UuIFRoZXJlZm9yZSwgYSBkZWVwZXIgZGl2ZSBpbnRvIGhvdyB0aGUgY3Jpc2lzIGltcGFjdGVkIHRoZSByZWxhdGl2ZSBkZW1hbmQgZm9yIHRoZXNlIGZlYXR1cmVzIGlzIGNyaXRpY2FsbHkgaW1wb3J0YW50IGluIHVuZGVyc3RhbmRpbmcgdGhlIGJpZ2dlciBwaWN0dXJlIG9mIENvdmlkLTE5J3MgaW1wYWN0IG9uIHRoZSBob3VzaW5nIG1hcmtldC4KCkEgcGFuZWwgb2YgYW5hbHlzaXMgc2hvd3MgdGhhdCBDb3ZpZC0xOSwgbWVhc3VyZWQgYnkgdGhlIGRhaWx5IDMtbW9udGggbW92aW5nIGF2ZXJhZ2Ugb2Ygb2ZmaWNpYWwgaW5mZWN0aW9ucyBhdCB0aGUgdGltZSBvZiBzYWxlLCBzaWduaWZpY2FudGx5IGluY3JlYXNlZCBhdmVyYWdlIGhvbWUgcHJpY2VzIGJ5ICo4Ljk3IFVTRCogcGVyIGFkZGl0aW9uYWwgZGFpbHkgaW5mZWN0aW9uLiBUaGlzIGZpbmRpbmcgZXN0YWJsaXNoZXMgdGhlIGNvcm9uYS1zcGVjaWZpYyByZWFjdGlvbiBvZiBob3VzaW5nIG1hcmtldCBwcmljZXMgdG8gZGFpbHkgaW5mZWN0aW9ucy4gV2hlbiBhbmFseXppbmcgaG93IHRoaXMgcHJpY2Ugc2hpZnQgaXMgZXhwbGFpbmVkIGJ5IHNwZWNpZmljIGRlbWFuZCBmb3IgY2VydGFpbiBwcm9wZXJ0eSBjaGFyYWN0ZXJpc3RpY3MsIEkgZmluZDogdGhlIHByZW1pdW1zIGZvciBlYWNoIGxldmVsIG9mIG51bWJlciBvZiBiZWRyb29tcyBpcyBzaWduaWZpY2FudGx5IGluY3JlYXNlZCBpbiByZXNwb25zZSB0byBkYWlseSBpbmZlY3Rpb25zLCB3aXRoIGFuIGF2ZXJhZ2UgaW5jcmVhc2Ugb2YgKjMyLCAzNywgMjcsIGFuZCA0NyBVU0QqIHBlciBhZGRpdGlvbmFsIGRhaWx5IGluZmVjdGlvbiBmb3IgbGV2ZWxzIDItdGhyb3VnaC01IGJlZHJvb21zIHJlc3BlY3RpdmVseTsgdGhlIHByZW1pbXVtIGZvciBiZWluZyBjZW50cmFsIHRvIGEgY2l0eSBpbmNyZWFzZWQgYnkgKjUuMTcgVVNEKiBwZXIgZGFpbHkgaW5mZWN0aW9uIHdoaWxlIHByb3BlcnRpZXMgbG9jYXRlZCBvdXRzaWRlIHRoZSBjaXR5IHdlcmUgbm90IHNpZ25pZmljYW50bHkgaW1wYWN0ZWQgYnkgZGFpbHkgaW5mZWN0aW9uczsgcHJlbWl1bXMgZm9yIGhvbWUgc2l6ZSBpbmNyZWFzZWQgYnkgKjAuMDIgVVNEKiBwZXIgZGFpbHkgaW5mZWN0aW9uLCB3aXRoIHRoZSBwcmVtaXVtIGZvciB0aGUgc21hbGxlc3QgaG9tZXMgYmVpbmcgc2lnbmlmaWNhbnRseSBkZWNyZWFzZWQgYnkgKjMuMTUgVVNEKiBwZXIgZGFpbHkgaW5mZWN0aW9uOyBwcmVtaXVtcyBmb3IgcHJvcGVydHkgYWdlLCB3aGljaCBhcmUgaGlzdG9yaWNhbGx5IG5lZ2F0aXZlLCBkZWNyZWFzZWQgZXZlbiBmdXJ0aGVyIHdpdGggdGhlIHBlbmFsdHkgZm9yIGVhY2ggYWRkaXRpb25hbCB5ZWFyIG9mIGFnZSBpbmNyZWFzaW5nIGJ5ICowLjA2IFVTRCogcGVyIGRhaWx5IGluZmVjdGlvbnMgd2l0aCB0aGUgb2xkZXN0IGhvbWVzIGV4cGVyaWVuY2luZyB0aGUgbGFyZ2VzdCBsb3NzIG9mICoyLjc1IFVTRCogcGVyIGRhaWx5IGluZmVjdGlvbiwgcGVyIHllYXIgb2YgYWdlIGFuZDsgYW4gaW5jcmVhc2UgaW4gdGhlIHBlbmFsdHkgZm9yIGVhY2ggYWRkaXRpb25hbCBkYXkgYSBob21lIHNpdHMgb24gdGhlIG1hcmtldCBvZiAqMC4wNCBVU0QqIHBlciBkYWlseSBpbmZlY3Rpb24gd2l0aCBob21lcyBzaXR0aW5nIHRoZSBsb25nZXN0IHBlcmlvZCBvZiB0aW1lIG9uIHRoZSBtYXJrZXQgZXhwZXJpZW5jaW5nIHRoZSBsYXJnZXN0IGxvc3Mgb2YgKjIuNzUqIHBlciBkYWlseSBpbmZlY3Rpb24sIHBlciBkYXkuCgpUaGVzZSBmaW5kaW5ncyBkZXNjcmliZSB0aGUgaWRlYWwgaG9tZSB0byBvd24gZHVyaW5nIHRoZSBjcmlzaXMgaXMgYSBuZXdseSBidWlsdCwgMywwMDAgc3FmdC4gb2YgbGl2aW5nIGFyZWEsIDUtYmVkcm9vbSBob3VzZSBjZW50cmFsbHkgbG9jYXRlZCB0byB0aGUgbmVhcmVzdCBjaXR5IHdoaWNoIGlzIHNvbGQgaW4gMCBkYXlzIG9uY2UgbWFkZSBwdWJsaWNseSBhdmFpbGFibGUgZm9yIHNhbGUuCgoKCldoYXQgbWV0aG9kcyBJIHVzZWQgdG8gZ2V0IHJlc3VsdHMKcmVzdWx0cwpjb25jbHVzaW9uIG9mIHRob3NlIHJlc3VsdHMKQ29ubmVjdGlvbgpDYWxsIHRvIGFjdGlvbgoKCgo8YnI+PGJyPgoKIyMjIDkuIEJpYmxpb2dyYXBoeQoKPGJyPjxicj4KCiMjIyA5LiBBcHBlbmRpeAoKPGJyPjxicj4KCjxicj48YnI+PGJyPgoKRW5kIG9mIERvY3VtZW50CgoK